(真心求解惑)关于SQL存储过程有几个疑问
先上段代码
问题1
为什么上述代码调用时给参数 21.3 money类型,总是报错,说转换字符出错之类的
从网上查是因为21.3中的点存储过程认成字符了??很疑惑
问题2
exec sp_executesql 和 exec(@sql) 有什么本质区别吗?我知道前者给参,后者是定义完整直接执行
可是什么时候用哪个呢?
问题3
比如在存储过程中执行 一句@sql=insert 在存储过程中调用 exec(@sql),然后再调用存储过程
直接写 insert 之后调用存储过程 exec procedureName
有什么区别吗?在什么时候用到哪个呢?
真心求解惑!
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
有什么区别吗?在什么时候用到哪个呢?
真心求解惑!
...全文
相关推荐
sql存储过程几个简单例子
sql存储是数据库操作过程中比较重要的一个环节,对于一些初学者来说也是比较抽象难理解的,本文我将通过几个实例来解析数据库中的sql存储过程,这样就将抽象的事物形象化,比较容易理解。 例1: create proc proc_stu @sname varchar(20), @pwd varchar(20) as select * from ren where sname=@sname and pwd=@pwd go 查看结果:proc_stu ‘admin’,’admin’ 例2: 下面的存储过程实现用户验证的功能,如果不成功,返回0,成功则返回1. CREATE PROCEDUREVAL
SQL语句创建存储过程
创建数据库的存储过程 要求: 实现增,删,查,改!!
SQL Server下几个危险的扩展存储过程
MSSQL数据库存在几个危险的扩展存储过程,默认Public组可执行权限,SQL注入者可利用此读取文件目录及用户组,并可通过先写入数据库然后导出为文件的方法往服务器写入危险脚本进一步提权,或直接使用某些存储过程执行命令,如xp_cmdshell。
SQL Server中存储过程比直接运行SQL语句慢的原因
SQL Server中存储过程比直接运行SQL语句慢的原因
SQL存储过程SQL存储过程SQL存储过程
存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程


疑难问题
