以下の方法でデータを含むメインテーブルから新しいテーブルにデータを入力するカーソルを作成しています
| アイテム | 色 |
|---|---|
| シャツ | 赤、青、緑、黄 |
アイテムをフェッチしてから、含まれている各色に従って行に追加することにより、新しいテーブルデータを入力したい
| アイテム | 色 |
|---|---|
| シャツ | 赤 |
| シャツ | 青い |
| シャツ | 緑 |
| シャツ | 黄色 |
私は方法で立ち往生しています
- 「色」文字列を区切る/分割する
- 配列に保存するには
- カーソルで使用するには
この目的のためにネストされたカーソルを使用するためです。
以下の方法でデータを含むメインテーブルから新しいテーブルにデータを入力するカーソルを作成しています
| アイテム | 色 |
|---|---|
| シャツ | 赤、青、緑、黄 |
アイテムをフェッチしてから、含まれている各色に従って行に追加することにより、新しいテーブルデータを入力したい
| アイテム | 色 |
|---|---|
| シャツ | 赤 |
| シャツ | 青い |
| シャツ | 緑 |
| シャツ | 黄色 |
私は方法で立ち往生しています
この目的のためにネストされたカーソルを使用するためです。
Sql Server 2005+ と XML データ型を使用すると、以下を確認できます。
DECLARE @Table TABLE(
Item VARCHAR(250),
Colors VARCHAR(250)
)
INSERT INTO @Table SELECT 'Shirt','Red,Blue,Green,Yellow'
INSERT INTO @Table SELECT 'Pants','Black,White'
;WITH Vals AS (
SELECT Item,
CAST('<d>' + REPLACE(Colors, ',', '</d><d>') + '</d>' AS XML) XmlColumn
FROM @Table
)
SELECT Vals.Item,
C.value('.','varchar(max)') ColumnValue
FROM Vals
CROSS APPLY Vals.XmlColumn.nodes('/d') AS T(C)
Faking Arrays in Transact SQLの記事では、PARSENAME() 関数 (5 項目に制限) の使用から CLR 関数の記述まで、この問題を解決するためのいくつかの手法について詳しく説明しています。
XML の回答は、特定のシナリオに合わせて選択できる詳細な手法の 1 つです。
いくつかのヒントを組み合わせて、次のように文字列分割の問題を解決しました。
SET NOCOUNT ON;
DECLARE @p NVARCHAR(1000), @len INT;
SET @p = N'value 1,value 2,value 3,value 4,etc';
SET @p = ',' + @p + ',';
SET @len = LEN(@p);
-- Remove this table variable creation if you have a permanent enumeration table
DECLARE @nums TABLE (n int);
INSERT INTO @nums (n)
SELECT A.n FROM
(SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY TableKey) as n FROM dbo.Table) A
WHERE A.n BETWEEN 1 AND @len;
SELECT SUBSTRING(@p , n + 1, CHARINDEX( ',', @p, n + 1 ) - n - 1 ) AS "value"
FROM @nums
WHERE SUBSTRING( @p, n, 1 ) = ',' AND n < @len;
文字列の長さの制限が 1000 であることを考慮すると、このサンプルのテーブル変数 @nums を作成するには、1000 行以上のテーブル (サンプル tsql の dbo.Table) が必要であることに注意してください。記事には、永続的な列挙表があります。
リンク サーバーで INFORMATION_SCHEMA ビューを使用してソース テーブルをレプリケートするステージング テーブルを作成するために、このようなことを達成しました。しかし、これはあなたが探している結果を作成するための修正版です。表示するときは、[色] 列から最後の 2 文字を削除することを忘れないでください。
SELECT
t.Item
, (
SELECT
x.Color + ', ' AS [data()]
FROM
Items x
WHERE
x.Item = t.Item
FOR XML PATH(''), TYPE
).value('.', 'varchar(max)') AS Colors
FROM
Items t
GROUP BY
t.Item