0

我编写了一个存储过程,它返回包含一些生成的 SQL 查询的 nvarchar 变量,以及第二个过程,它使用 FOR XML PATH 生成 XML。我想修改生成 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 行
'<' 附近的语法不正确。
Msg 137, Level 15, State 1, Line 4
必须声明标量变量“@xml”。
Msg 137, Level 15, State 2, Line 216
必须声明标量变量“@xml”。
消息 156,级别 15,状态 1,第 217 行
关键字“FOR”附近的语法不正确。
Msg 137, Level 15, State 1, Line 219
必须声明标量变量“@xml”。
Msg 137, Level 15, State 2, Line 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
以 CDATA[DECLARE @xml xml SELECT TOP 1 @xml = x FROM iksemel ORDER BY id INSERT INTO ARTYKUL_TEST(ID_ARTYKULU,ID_MAGAZYNU' 开头的标识符太长。最大长度为 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 回答