2017-03-02 21 views
0

2つの列IDと権限を持つテーブルがあります。権利列は '010111100000000 .... 250 times'のように0,1の形式で250の固定文字を保持します。今すぐ権利列を分割し、構造ID、権利(0または1)、位置(1〜250)を持つ一時テーブルで結果を取得する必要があります。私が最初に5行を持っていて、次にtempテーブルに5 * 250 = 1250行を得ると仮定します。一時テーブルと分割文字列を持つSQL Serverのcte

私は1つの文字列を分割してカーソルを使用しましたが、今はカーソルを避けたいと思います。どのように私はこれを達成することができます。

declare @temp table(Chars int not null, RowID int not null) 

    --Split the rights string into 250 char rows with RowID as each position 
    ;with cte as 
    (
     select substring(@rights, 1, 1) as Chars, 
       stuff(@rights, 1, 1, '') as rights, 
       1 as RowID 
     union all 
     select substring(rights, 1, 1) as Chars, 
       stuff(rights, 1, 1, '') as rights, 
       RowID + 1 as RowID 
     from cte 
     where len(rights) > 0 

    ) 

    --Get the values in a temporary table except 0 
    insert into @temp select Chars, RowID from cte option (MAXRECURSION 300); 

答えて

1

これはどうですか?

アイデアがある:250のランニング番号のリストを取得し、それぞれの位置から1つの文字を読むためにSUBSTRINGを使用します。

DECLARE @tbl TABLE (ID INT IDENTITY,Rights VARCHAR(250)); 
INSERT INTO @tbl VALUES 
('1011101110000101010111000...'), ('0100010111100010101...'); 

WITH Nr250 AS 
(SELECT TOP 250 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nr FROM master.dbo.spt_values) 

SELECT t.ID 
     ,t.Rights 
     ,Nr AS Position 
     ,SUBSTRING(t.Rights,Nr,1) AS PosDigit 
--INTO #SomeTempTable 
FROM Nr250 
CROSS JOIN @tbl AS t 

あなたは一時テーブルにこれを書きたい場合は、単にINTO--を削除します

+0

ありがとうございました – Anurag

関連する問題