【问题标题】:SQL server stored procedure insert with dynamic execSQL 服务器存储过程插入与动态 exec
【发布时间】:2018-04-01 07:21:59
【问题描述】:

当给定插入中的所有列名时,我无法插入记录

下面是SP

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

选择@counts 作为计数

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

"

command: exec dbo.test @tab_name='inventory',@tab_id=4,@tab_n='chiku',@tab_q=123

在删除列名时插入记录,但在插入期间不能与列名一起使用。

请帮忙。

谢谢

【问题讨论】:

  • declare @sql1 as nvarchar(50) dat 是否足够长,可用于动态查询?
  • 感谢 frederik-de-clercq 我把它设置为最大并且它的工作..错误显示在 exec 命令的第 1 行.. 真的很沮丧。非常感谢

标签: sql-server stored-procedures dynamic exec


【解决方案1】:

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

一位 dba 还告诉我在字符串前使用 N' 作为前缀来表示 Unicode 字符串文字。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-20
      • 2013-02-28
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 2017-01-26
      相关资源
      最近更新 更多