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;
我正在使用 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;