2016-05-02 114 views
0

以下是我正在执行的查询。我在@XMLdata参数中从c#获取XML输入。sql服务器中的XML错误

CREATE TABLE #TablesList 
(
    TableName VARCHAR(500), 
    RefTable VARCHAR(500), 
    RefTableIDColumn VARCHAR(500) 
) 


SET @Query = @Query + ' INSERT INTO #TablesList SELECT ref.value(''tablename[1]'',''nvarchar(500)'') AS tablename,' 
SET @Query = @Query + ' ref.value(''refTable[1]'',''nvarchar(500)'') AS refTable, ref.value(''refTableIDColumn[1]'',''nvarchar(500)'') AS refTableIDColumn FROM ' 
SET @Query = @Query + @XMLdata+'.nodes(''//Table[@name="'[email protected]+'"]'') AS R(ref)' 
EXEC(@Query) 

当我执行查询时,出现以下错误。错误是第二个最后一行

The data types varchar(max) and xml are incompatible in the add operator. 
+0

哪些数据类型的'@ Query'和'@ XMLdata'? – Adwaenyth

+0

varchar(max)和XML分别为 – user2998990

+0

然后它不起作用,因为您尝试将'XML'数据类型隐式转换为未定义的'varchar'。如果您需要在构造的查询中将'XML'作为'XML'数据类型访问,则需要传递它,选择它或以其他方式在您尝试创建的查询中构造它。 – Adwaenyth

回答

2

注入的@XMLdata内容到您的动态SQL字符串,而不是,试图通过@XMLdata作为参数传递给sp_executesql:张贴在

..... 
SET @Query = @Query + '@XMLdata.nodes(''//Table[@name="'[email protected]+'"]'') AS R(ref)' 
EXEC sp_executesql @Query, N'@XMLdata XML', @XMLdata 

至于动态SQL问题是,你可以完全避免使用动态SQL。动态SQL的唯一的“动态”部分来自@DataItem变量的值,可以随便使用sql:variable()进行处理,如下:

INSERT INTO #TablesList 
SELECT 
    ref.value('tablename[1]','nvarchar(500)') AS tablename, 
    ref.value('refTable[1]','nvarchar(500)') AS refTable, 
    ref.value('refTableIDColumn[1]','nvarchar(500)') AS refTableIDColumn 
FROM @XMLdata.nodes('//Table[@name=sql:variable("@DataItem")]') AS R(ref) 
+1

我想,你的魔法玻璃球指向正确的方向(+1从我身边),但我的问题是,为什么需要动态SQL和'sp_executesql'呢? – Shnugo

+0

@Shnugo你是对的。 OP发布的SQL可以完全不使用动态SQL(更新我的答案以包含这一点)。也许有一部分动态SQL没有显示出问题,迫使他*去那条路线,不确定.... – har07

+0

你是天才....那工作... – user2998990