任何人都可以帮忙解决此案吗?如何使用动态查询插入表?
DECLARE
@TypeCode varchar(25),
@BomDateB varchar(25),
@BomDateA varchar(25),
@TbName varchar(25),
@SQL varchar(max)
SET @TypeCode = 'PS-BPRG15AGW'
SET @TbName = 'z'+@TypeCode
SET @BomDateB = '8/19/2016'
SET @BomDateA = '8/20/2016'
SET @SQL = 'UPDATE [PMLite].[dbo].['+@TbName+']
SET [BOM Date] = '+@BomDateA+'
WHERE [BOM Date] = '+@BomDateB+''
EXEC sp_executesql @SQL
答案 0 :(得分:1)
这是进行更新的正确方法:
DECLARE @TypeCode VARCHAR(25)
, @BomDateB VARCHAR(25)
, @BomDateA VARCHAR(25)
, @TbName NVARCHAR(25)
, @SQL NVARCHAR(MAX);
SET @TypeCode = N'PS-BPRG15AGW';
SET @TbName = N'z' + @TypeCode;
SET @BomDateB = '8/19/2016';
SET @BomDateA = '8/20/2016';
SET @SQL = N'
UPDATE [PMLite].[dbo].' + QUOTENAME(@TbName) + '
SET [BOM Date] = CONVERT(NVARCHAR(24), @BomDateA, 121)
WHERE [BOM Date] = CONVERT(NVARCHAR(24), @BomDateB, 121);';
EXEC sp_executesql @SQL
, N'@BomDateB VARCHAR(25), @BomDateA VARCHAR(25)'
, @BomDateB
, @BomDateA;
就像我在评论中所说的那样,当不是绝对需要时,不要将动态SQL连接起来(参见@BomDateA
和@BomDateB
参数)。
请使用QUOTENAME()
而不是用括号括起文字。此内置函数用于将对象名称包装到括号中,并将代码保护为SQL Injection。
从文档中获取:
QUOTENAME(Transact-SQL)
返回一个Unicode字符串,其中添加了分隔符以进行输入 string一个有效的SQL Server分隔标识符。
答案 1 :(得分:0)
您的@ SQL
应为NVARCHAR
..
所以改变如下
Declare @Sql NVARCHAR(4000)
最后代码中会出现一些错误,to avoid conversion issues ..所以
更改日期,如
SET [BOM Date] = '+@BomDateA+'
到
SET [BOM Date] = '+''''+CONVERT(nvarchar(24), @BomDateA, 121)+''''+'