用于xml路径和子查询的TSQL内容

时间:2015-03-13 21:21:16

标签: sql-server tsql

我要用csv格式的对应ID替换列中的csv数据

我的查询存在问题:

select t0.code , t0.categories, t0.departement, (
    SELECT Stuff((
        SELECT N', ' + CONVERT(varchar, id_categorie) FROM tcategories t1 WHERE t0.departement = t1.departement COLLATE French_CI_AI and categorie IN (t0.tcategories)  
    FOR XML PATH(''),TYPE).value('text()[1]','varchar(max)'),1,1,N'')) as id_colonne  
FROM #codes_reductions t0 where categories is not null 

结果如下:

  

代码|类别|部门| id_colonne

     

AIRSTREAM | ' A'' B'' BA' | JMQ | NULL

如果我更换'和类别IN(t0.tcategories)'通过和分类IN(' A',' B'' BA')查询效果很好

结果如下:

  

代码|类别|部门| id_colonne

     

AIRSTREAM | ' A'' B'' BA' | JMQ | 128,129,260

我尝试在我的专栏上使用COLLATE French_CI_AI,但没有成功。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

... categorie IN (t0.tcategories) ....

问题的原因categorie列将这些值('A','B','BA')存储为单个值而不是数组/列表/值表。因此,SQL Server比较两个字符串,因此s1 IN (s2)相当于s1 = s2 => A IN('A','B','BA')< => A = 'A','B','BA'

示例(注意:双引号('')用于定义空字符串,而四个单引号('''')用于定义带有单引号的字符串:{{1} }):

SELECT '''' --> '

短期解决方案是使用以下条件之一:

DECLARE @categories VARCHAR(1000);

SET     @categories = '''A'',''B'',''BA'''
SELECT @categories AS ColA, CASE WHEN 'A' IN (@categories) THEN 'TRUE' ELSE 'FALSE' END AS Col2
/*
ColA         Col2
------------ -----
'A','B','BA' FALSE
*/

示例:

C#1 (if categorie contains single quotes):  ... t0.tcategories LIKE '%' + categorie + '%' ....

C#2 (when categorie doesn't contains single quotes):  ... t0.tcategories LIKE '%''' + categorie + '''%' ....

第二个注释:当DECLARE @categories VARCHAR(1000); SET @categories = '''A'',''B'',''BA''' SELECT @categories AS ColA, CASE WHEN @categories LIKE '%''A''%' THEN 'TRUE' ELSE 'FALSE' END AS Col2 /* ColA Col2 ------------ ----- 'A','B','BA' TRUE */ 列中的每个单独的值不包含单引号时(例如:t0.tcategories / 'B'A'),此方法有效

在中/长期,您应该使用另一个表单独存储'B''A'列中的每个值:

tReduction.tCategories

因此,条件成为

CREATE TABLE dbo.ReductionCategory (
... pk ...,
ReductionCode INT NOT NULL REFERENCES dbo.tReduction(ReductionCode), -- FK
CategoryCode INT NOT NULL REFERENCES dbo.tCategories(CategoryCode) -- FK  
)