0

生成された SQL クエリを含む nvarchar 変数を返すストアド プロシージャと、FOR XML PATH を使用して XML を生成する 2 つ目のプロシージャを作成しました。XML を生成するプロシージャを変更し、生成されたクエリのコンテンツを最初のプロシージャから生成された XML に追加したいと考えています。

XML を生成する手順の一部:

SELECT @SQLStr = 'SELECT';

    DECLARE @tmp varchar(100), @tmpkod varchar(max);
    DECLARE c CURSOR LOCAL READ_ONLY FOR
    SELECT tableName, tableCode FROM @TableNames 
    OPEN c
    FETCH NEXT FROM c INTO @tmp, @tmpkod;
    WHILE @@FETCH_STATUS = 0 
    BEGIN

    SELECT @i = @i - 1;
    SELECT @SQLStr = @SQLStr + '(SELECT TOP 10 * FROM ' + @tmp + ' FOR XML PATH(''row''), TYPE) AS ' + @tmp + ',
    '
    EXEC GenerujSelectazXML @tmp, @tmpcode output;

    SELECT @SQLStr = @SQLStr + '(SELECT ' + @tmpCode + ' FOR XML PATH (''row''), TYPE) AS ' + @tmp + '_TEST'
    SELECT @tmpcode

    IF (@i <> 0) SELECT @SQLStr = @SQLStr + ',
    '
    ELSE SELECT  @SQLStr = @SQLStr + '
    '
    FETCH NEXT FROM c INTO @tmp, @tmpkod;
    END
    CLOSE c; DEALLOCATE c;

    SELECT @SQLStr = @SQLStr + 'FOR XML PATH(''''), ROOT(''root'')';

    EXEC (@SQLStr) 

「 < 」、「 > 」などの特殊文字が含まれており、xml タグの開始/終了であるため、クエリのコンテンツを単純に XML に入れることはできません。そのため、クエリ コマンドを XML コメントに入れることで問題が解決すると考えました。

私はこれを試しました:

    SELECT @SQLStr = '<!--' + @tmpCode + '-->';

それは役に立たなかった、私はエラーを得た:

メッセージ 102、レベル 15、状態 1、行 3
'<' 付近の構文が正しくありません。
メッセージ 137、レベル 15、状態 1、行 4
スカラー変数「@xml」を宣言する必要があります。
メッセージ 137、レベル 15、状態 2、行 216
スカラー変数「@xml」を宣言する必要があります。
メッセージ 156、レベル 15、状態 1、行 217
キーワード「FOR」付近の構文が正しくありません。
メッセージ 137、レベル 15、状態 1、行 219
スカラー変数「@xml」を宣言する必要があります。
メッセージ 137、レベル 15、状態 2、行 416
スカラー変数「@xml」を宣言する必要があります。
メッセージ 156、レベル 15、状態 1、行 417
キーワード「FOR」付近の構文が正しくありません。
メッセージ 137、レベル 15、状態 1、

メッセージ 137、レベル 15、状態 2、行 540
スカラー変数「@xml」を宣言する必要があります。

私もこれを試しました:

SELECT @SQLStr = '<![CDATA[' + @tmpCode + N']]>';

それも役に立ちませんでした。

私が得たエラーメッセージ:

メッセージ 102、レベル 15、状態 1、行 3
'<' 付近の構文が正しくありません。
Msg 103, Level 15, State 4, Line 3
The identifier that starts with CDATA[DECLARE @xml xml SELECT TOP 1 @xml = x FROM iksemel ORDER BY id INSERT INTO ARTYKUL_TEST(ID_ARTYKULU,ID_MAGAZYNU' is too long. Maximum length is 128 .
Msg 105、Level 15、State 1、Line 541
文字列 ')' の後の閉じていない引用符。

助けてください

4

1 に答える 1

1

生成しようとしている xml の例を教えてください。あなたが投稿したコードに基づいて、私はそれがこのように見えると仮定しています。

<root>
  <Instructors>
    <row>
      <InstructorName>Graff</InstructorName>
    </row>
  </Instructors>
 <Instructors_TEST>
   <row>0</row>
 </Instructors_TEST>
</root>

生成された SQL を次のように変更する必要があります。

SELECT (
  SELECT * FROM Instructors FOR XML PATH('row'), TYPE
) AS Instructors,
(
  SELECT 0 FROM Instructors FOR XML PATH('row'), TYPE
) AS Instructors_TEST
FOR XML PATH(''), ROOT('root')

問題は、xml に保存しようとしている値 (クエリ) ではありません。@tmpCode で SELECT を実行し、エディターに貼り付けて、有効な文字列かどうかを確認します。そうではありません。

コードでは、次のようになります。

SELECT @tmpCode = '''SELECT value(''ID_ARTYKULU[1]'')'''
--'SELECT value('ID_ARTYKULU[1]')'

しかし、あなたはこれを使いたい:

SELECT @tmpCode = '''SELECT value(''''ID_ARTYKULU[1]'''')'''
--'SELECT value(''ID_ARTYKULU[1]'')'

ゲットー修正は、 @tmpCode セクションを次のように置き換えることです。

SELECT @tmpCode = N'''' + REPLACE('SELECT value(''ID_ARTYKULU[1]'')', N'''', N'''''') + N''''

動的 SQL を使用しているため、引用符をエスケープするときは十分に注意する必要があります。

于 2013-09-16T03:30:33.707 に答える