使用SQL Server中的sp_executesql更新表

时间:2016-08-21 07:38:30

标签: sql-server-2008

任何人都可以帮忙解决此案吗?如何使用动态查询插入表?

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

2 个答案:

答案 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)+''''+'