0

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
4

1 に答える 1

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 インジェクションを防ぐ 1 つの方法は、変数を SQL-Server に渡す前に、C# コードで SQL インジェクションに対して検証することです。

別の方法 (またはおそらく推測で最もよく使用される) は、「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 に渡す必要があります。

于 2013-03-14T12:24:03.657 に答える