2013-03-14 73 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。