SET - 在带有传递变量的 SQL 中执行

SET - EXECUTE in TSQL with passed variable

我正在使用 OPENROWSET (BULK...) 插入,在最终粉碎和转换它之前,我将一个小的 XML 文件插入到 table 中。以下工作正常(非常感谢其他帖子)。

DECLARE @v_inputfile AS varchar(50)
DECLARE @v_xmlfile AS xml
DECLARE @v_sql AS nvarchar(1000)
DECLARE @v_loadeddatetime AS DATETIME

SET @v_inputfile='E:\inputfile.xml'
SET @v_sql= 'INSERT INTO'+
    ' Tbl1_XMLStaging1 (XMLData, LoadedDateTime)' +
    ' SELECT CONVERT(XML, BulkColumn), ' +
    ' GETDATE() ' +
    'FROM OPENROWSET(BULK '''+ @v_inputfile +''', SINGLE_BLOB) AS x;'
EXEC(@v_sql);

但是,我的目标也是将 InputFileName 插入 Tbl1_XMLStaging1,但我遇到了 Select 语句中的 @v_inputfile 作为变量传递到询问。

我尝试了以下方法:

DECLARE @v_inputfile AS varchar(50)
DECLARE @v_xmlfile AS xml
DECLARE @v_sql AS nvarchar(1000)
DECLARE @v_loadeddatetime AS DATETIME

SET @v_inputfile='E:\inputfile.xml'
SET @v_sql= 'INSERT INTO'+
    ' Tbl1_XMLStaging1 (XMLData, LoadedDateTime, XMLFileName)' +
    ' SELECT CONVERT(XML, BulkColumn), ' +
    ' GETDATE(), ' +
    '@v_inputfile ' +
    'FROM OPENROWSET(BULK '''+ @v_inputfile +''', SINGLE_BLOB) AS x;'
EXEC(@v_sql);

我收到各种错误消息:

Must declare the scalar variable "@v_inputfile"

如果删除变量周围的单引号,则会出现错误

Incorrect syntax near 'E:'

我已经梳理了之前的几篇文章,如果不进行其他操作,似乎无法通过这个。

回复后。我正在尝试以下操作并收到错误

Incorrect syntax near ',

代码:

DECLARE @v_inputfile AS varchar(50)
DECLARE @v_xmlfile AS xml
DECLARE @v_sql AS nvarchar(1000)
DECLARE @v_stmt AS nvarchar(1000)
DECLARE @params AS nvarchar(100)
DECLARE @v_loadeddatetime AS DATETIME

SET @v_inputfile='E:\inputfile.xml'
SET @v_sql= 'INSERT INTO'+
    ' Tbl1_XMLStaging1 (XMLData, LoadedDateTime, XMLFileName)' +
    ' SELECT CONVERT(XML, BulkColumn), ' +
    ' GETDATE(),' +
    ' @v_inputfile ' +
    'FROM OPENROWSET(BULK '''+ @v_inputfile +''', SINGLE_BLOB) AS x;'
EXEC @v_stmt = @v_sql, @params = N'@v_inputfile varchar(50)', @v_inputfile;

问题是在 execute 的上下文中,无法访问在另一个范围内声明的变量。有两种方法可以解决这个问题。

您可以将 '@v_inputfile ' + 行更改为 '''' + @v_inputfile + '''' + 以提供变量的 作为带引号的字符串。这有点脆弱,不应该与可能不可信的输入一起使用,例如用户输入的东西,以免遇到Bobby Tables.

或者,使用带有 sp_executesql 的参数:

execute sp_executesql @stmt = @v_sql,
  @params = N'@v_inputfile varchar(50)', @v_inputfile = @v_inputfile

这是一个更强大的解决方案,可以防止 SQL 注入攻击。

以下作品。

DECLARE @v_inputfile AS varchar(50)
DECLARE @v_xmlfile AS xml
DECLARE @v_sql AS nvarchar(1000)
DECLARE @v_stmt AS nvarchar(1000)
DECLARE @params AS nvarchar(100)
DECLARE @v_loadeddatetime AS DATETIME

SET @v_inputfile='E:\inputfile.xml'
SET @v_sql= 'INSERT INTO'+
    ' Tbl1_XMLStaging1 (XMLData, LoadedDateTime, XMLFileName)' +
    ' SELECT CONVERT(XML, BulkColumn), ' +
    ' GETDATE(),' +
    ' @v_inputfile ' +
    'FROM OPENROWSET(BULK '''+ @v_inputfile +''', SINGLE_BLOB) AS x;'
EXECUTE sp_executesql @v_stmt = @v_sql, 
    @params = N'@v_inputfile varchar(50)', @v_inputfile = @v_inputfile;