SQL Server存储过程插入动态exec

时间:2017-10-20 06:45:55

标签: sql-server stored-procedures dynamic exec

在给出插入

中的所有列名时无法插入记录

以下是SP

>>> import json
>>> d = {'a': 'foobar'}
>>> json_from_d = json.dumps(d)
>>> json_from_d
'{"a": "foobar"}'
>>> 
>>> new_d_from_json = json.loads(json_from_d)
>>> new_d_from_json
{u'a': u'foobar'}

选择@counts作为计数

ALTER PROCEDURE [dbo].[test]
@tab_name nvarchar(50),
@tab_id int,
@tab_n nvarchar(50),
@tab_q int
as
Begin
declare @sql as nvarchar(50);
declare @counts as int;

select @sql='select @cnt=count(*) from '+@tab_name+' where id='+cast(@tab_id as varchar)+';'
exec sp_executesql @sql,N'@cnt int output', @cnt=@counts output

if @counts=1
begin
declare @sql1 as nvarchar(50);
select @sql1='update '+@tab_name+' set quantity='+cast(@tab_q as varchar)+'     where id='+cast(@tab_id as varchar)+';'
exec sp_executesql @sql1
end
else
begin
declare @sql2 as nvarchar(50);
set @sql2='insert into '+@tab_name+' (id,name,quantity) values ('+CAST(@tab_id as varchar)+','''+@tab_n+''''
set @sql2+=','+CAST(@tab_q as varchar)+');'
select @sql2
exec sp_executesql @sql2
end
End
删除列名时会插入

记录,但在插入期间不能使用列名。

请帮忙。

由于

2 个答案:

答案 0 :(得分:1)

最好使用A nvarchar(max)进行带参数的动态查询。 因为你永远不知道字符串可以有多长。除非你知道字符串的最大长度。

dba还告诉我要用N'作为字符串之前的前缀,表示Unicode字符串文字。

答案 1 :(得分:0)

增加@sql变量大小,如下所示:

declare @sql as nvarchar(max);
....

declare @sql1 as nvarchar(max);
...

declare @sql2 as nvarchar(max);