将查询更改为动态sql

时间:2013-03-14 11:46:11

标签: sql-server

我有以下查询,它接受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

1 个答案:

答案 0 :(得分: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。