2013-03-14 55 views
0

我有以下查询,它接受XML输入并将它们存储到临时表中。 我需要查询的动态或将调整到任何表或列号修改dynamically.How功能做我这样做:将查询更改为动态sql

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 
+0

您的问题是否已被解答?还是需要更多帮助? – 2013-03-20 21:51:49

回答

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注入来验证它在你的C#代码传递变量SQL-Server之前。

另一种方法(或可能最适用于猜测)不是使用“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。