我有一个名为Xref的表。
由ShaftecNo, CompNo, CompName
列组成。
我正在尝试编写一个透视查询,显示[ShaftecNo],[CompNo]
,然后[CompName]
作为列。导致以下格式
我的存储过程中使用的代码如下。
declare @sql nvarchar(max);
-- generate the column names
select @sql = coalesce(@sql + ',', '') + QuoteName([CompName])
from (select DISTINCT CompName from [Xrefs] WHERE CompName LIKE '[a-z]%') T;
-- replace the column names into the generic PIVOT form
set @sql = REPLACE('
select ShaftecNo, :columns:
from (SELECT ShaftecNo,CompNo,CompName FROM Xrefs INNER JOIN Product ON Xrefs.ShaftecNo COLLATE Latin1_General_CI_AS = Product.KeyCode) p
pivot (max(CompNo) for CompName in (:columns:)) as pv',
':columns:', @sql)
-- execute for the results
exec (@sql)
请注意,如果我将它更改为[a-c](只有[CompName]以a-c范围开头),所使用的LIKE命令将起作用,如果我执行更大的范围,如[a-r]它的错误。
Msg 105,Level 15,State 1,Line 4 字符串'ALFAROME'后面的未闭合引号。 Msg 102,Level 15,State 1,Line 4 “ALFAROME”附近的语法不正确。
不同范围的错误会发生变化。如果我完全把这个问题拿出来,那么查询就会起作用,但它会错过公司名称(即.Brake Engineering)。
任何人都可以提供帮助
答案 0 :(得分:0)
听起来您的CompName
字段的值包含单引号,因此在构建@sql
值时需要删除/替换它们:
declare @sql nvarchar(max);
-- generate the column names
select @sql = coalesce(@sql + ',', '') + QuoteName(replace([CompName],'''',''))
from (select DISTINCT CompName from [Xrefs] WHERE CompName LIKE '[a-z]%') T;
-- replace the column names into the generic PIVOT form
set @sql = REPLACE('
select ShaftecNo, :columns:
from (SELECT CompNo,replace(CompName,'''''''','''') as CompName FROM a INNER JOIN Product ON Xrefs.ShaftecNo COLLATE Latin1_General_CI_AS = Product.KeyCode) p
pivot (max(CompNo) for CompName in (:columns:)) as pv',
':columns:', @sql)
-- execute for the results
exec (@sql)
答案 1 :(得分:0)
感谢您的帮助。 PRINT @SQL命令就像一个梦想。 (谢谢Nick.McDermaid)。
问题是一个随机的unicode ascii字符 - 160.我必须使用...
从[Xrefs_Temp]中选择不同的Compname,ASCII(SUBSTRING(Compname,LEN(Compname)-1,LEN(Compname)))。
然后我用空白替换它并且它起作用了。
再次感谢