考慮規範化你的數據庫。如果您有未知數據,請使用xml(自SQL Server 2005以來受支持)或JSON(自SQL Server 2016以來受支持)。使用此查詢爲出發點:
WITH Src AS
(
SELECT * FROM (VALUES
('6829556334057807840', 'Part Notes', 'Drilling Required: No,Install Time: 30 Minutes,Fascia Trimming: Yes (minor),Visibility: Exposed')
) T(itemid, attributename, value)
), Recurse AS
(
SELECT
itemid,
SUBSTRING(value, 1, CASE WHEN CHARINDEX(',', value, 1)=0 THEN LEN(value) ELSE CHARINDEX(',', value, 1)-1 END) Item,
SUBSTRING(value, CASE WHEN CHARINDEX(',', value, 1)=0 THEN LEN(value) ELSE CHARINDEX(',', value, 1)+1 END, LEN(value)) Rest
FROM Src
UNION ALL
SELECT
itemid,
CASE WHEN CHARINDEX(',', Rest, 1)=0 THEN Rest ELSE SUBSTRING(Rest, 1, CHARINDEX(',', Rest)-1) END Item,
CASE WHEN CHARINDEX(',', Rest, 1)=0 THEN NULL ELSE SUBSTRING(Rest, CHARINDEX(',', Rest)+1, LEN(Rest)) END Rest
FROM Recurse
WHERE Rest IS NOT NULL
)
SELECT
itemid,
SUBSTRING(Item, 1, CHARINDEX(':', Item)-1) [Key],
SUBSTRING(Item, CHARINDEX(':', Item)+1, LEN(Item)) [Value]
FROM Recurse
它返回:與XML
itemid Key Value
------------------- -------------------- -------------
6829556334057807840 Drilling Required No
6829556334057807840 Install Time 30 Minutes
6829556334057807840 Fascia Trimming Yes (minor)
6829556334057807840 Visibility Exposed
這實際上並不需要是動態數據透視表。您只需將分隔的字符串拆分爲行,然後再分割爲單獨的列。 – Matt
這裏的* best *解決方案不是首先將這樣的數據存儲起來。如果可以的話,修復你的數據庫,而不是試圖讓SQL Server進行尷尬的轉換。 – DavidG