2013-03-14 5 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

На ваш вопрос ответили или вам нужна дополнительная помощь? –

ответ

1

Для создания динамической SQL необходимо создать запрос в виде строки , Использование If Statement и другой логики для добавления ваших переменных ... и т. Д.

Объявите текстовую переменную и используйте ее, чтобы объединить ваш желаемый 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 Injection ».

Вы можете прочитать об этом здесь: 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.

Смежные вопросы