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