0

我有以下查询,它接受 XML 输入并将它们存储到临时表中。我需要使查询动态或动态调整任何表或列号修改的函数。我该怎么做:

DECLARE @sXML NVARCHAR(4000) 
DECLARE @hDoc INT  
SET @sXML = ' 
<Root> 
 <Item> 
  <Key>1</Key> 
  <Test1>A</Test1> 
  <Test2>A2</Test2> 
 </Item> 
 <Item> 
  <Key>2</Key> 
  <Test1>B</Test1> 
  <Test2>B3</Test2> 
 </Item> 
</Root> 
'  
CREATE TABLE #tabletest 
( 
 [Key] INT, 
 Test1 NVARCHAR(50), 
 Test2 NVARCHAR(50) 
) 
EXEC sp_xml_preparedocument @hDoc OUTPUT, @sXML 
INSERT INTO #tabletest SELECT * FROM OPENXML (@hDoc, '/Root/Item', 2) WITH #tabletest 
EXEC sp_xml_removedocument @hDoc 

select * from #tabletest  
DROP TABLE #tabletest
4

1 回答 1

1

要创建动态 SQL,您需要将查询构建为字符串。使用 If 语句和其他逻辑来添加变量...等。

声明一个文本变量并使用它来连接你想要的 SQL。

然后,您可以使用“EXEC”命令执行此代码

例子:

DECLARE @SQL VARCHAR(100)
DECLARE @TableOne VARCHAR(20) = 'TableOne'
DECLARE @TableTwo VARCHAR(20) = 'TableTwo'
DECLARE @SomeInt INT

SET @SQL = 'INSERT INTO '

IF (@SomeInt = 1)
    SET @SQL = @SQL + @TableOne

IF (@SomeInt = 2)
    SET @SQL = @SQL + @TableTwo

SET @SQL = @SQL + ' VALUES....etc'

EXEC (@SQL)

但是,使用此方法时您真正应该注意的是称为“SQL 注入”的安全问题。

你可以在这里阅读:http: //msdn.microsoft.com/en-gb/library/ms161953 (v=sql.105).aspx

防止 SQL 注入的一种方法是在将变量传递给 SQL-Server 之前在 C# 代码中对其进行验证。

另一种方法(或者可能在推测中最好使用)不是使用“EXEC”命令,而是使用一个名为“sp_executesql”的内置存储过程。

可在此处找到详细信息:http: //msdn.microsoft.com/en-gb/library/ms188001.aspx 此处详细说明了如何使用:http: //msdn.microsoft.com/en-gb/library /ms175170(v=sql.105).aspx

您必须稍微不同地构建 SQL 并将参数传递给存储过程以及 @SQL。

于 2013-03-14T12:24:03.657 回答