(真心求解惑)关于SQL存储过程有几个疑问

和永恒有關 和永恒有關 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
先上段代码

create table Account
(
accid char(32),
balance money,
creditlast datetime,
userid varchar(32)
)
go
if exists(select * from sysobjects where name='pro_Account')
drop procedure pro_Account
go
create procedure pro_Account
@UserID nvarchar(36), --用户ID
@Operate int, --操作 0充值,1支取
@MyMoney money, --金额
@BankID int, --银行ID
@State int --返回状态0失败,1成功,2余额不足
as
declare @isUser int=0, --是否存在用户
@mySql nvarchar(max), --执行SQL语句
@errNo int=0, --总错误
@myCount int=0 --影响行数
begin transaction
select @isUser=COUNT(accid) from Account where userid=@UserID
if(@isUser<=0)
begin
declare @accid nvarchar(36)=REPLACE(convert(varchar(36),NEWID()),'-',''),
@mydate nvarchar(100)=convert(nvarchar(100),GETDATE(),20)
print @mydate
print @accid

set @MyMoney=CAST(@MyMoney as money)
print cast(@mymoney as nvarchar(20))
set @mySql='insert into Account values('''+@accid+''','+@MyMoney+','''+@mydate+''','''+@UserID+''')'
exec sp_executesql @mySql,N'@accid nvarchar(36),@MyMoney money,@mydate nvarchar(100),@UserID nvarchar(36)',@accid,@MyMoney,@mydate,@UserID
--exec sp_executesql @mySql,N'@accid nvarchar(36),@mydate nvarchar(100),@UserID nvarchar(36)',@accid,@mydate,@UserID

set @mycount=@myCount+@@ROWCOUNT
print @mysql
print @mycount
set @errNo=@errNo+@@ERROR
print @errNo
if(@errNo>0 or @myCount<=0)
begin
print '回滚'
rollback
return
end
end
commit

调用
declare @id nvarchar(36)
set @id=REPLACE(convert(varchar(36),NEWID()),'-','')
exec pro_Account @id,0,21.3,0,0

问题1
为什么上述代码调用时给参数 21.3 money类型,总是报错,说转换字符出错之类的
从网上查是因为21.3中的点存储过程认成字符了??很疑惑
问题2
exec sp_executesql 和 exec(@sql) 有什么本质区别吗?我知道前者给参,后者是定义完整直接执行
可是什么时候用哪个呢?
问题3
比如在存储过程中执行 一句@sql=insert 在存储过程中调用 exec(@sql),然后再调用存储过程
直接写 insert 之后调用存储过程 exec procedureName
有什么区别吗?在什么时候用到哪个呢?


真心求解惑!
...全文

相关推荐

评论 50
收藏 已收藏
分享
返回顶部
和永恒有關
疑难问题 22,298 成员 121,727 内容