2016-08-10 26 views
0

予想される出力に示されているようにスクリプトが必要ですが、何をしても、私が使用しているものはすべて現在の出力に表示されるスクリプトになります。カンマ区切りの値を変数から区切る

DECLARE @query varchar(max), 
@col varchar(250) = 'd1,d2,d3' 


Set @query = 'INSERT INTO [dbo].[MYTABLE](
        '[email protected]+' 
        ) 
        SELECT ''~N'' AS ['[email protected]+']' 
print @query 

電流出力

INSERT INTO [dbo].[MYTABLE](
        d1,d2,d3 
        ) 
        SELECT '~N' AS [d1,d2,d3] 

の予想される出力

INSERT INTO [dbo].[MYTABLE](
        d1,d2,d3 
        ) 
        SELECT '~N' AS [d1], 
          '~N' AS [d2], 
          '~N' AS [d3] 
+0

あなたのテーブル定義とdefintionは – TheGameiswar

答えて

1

はカンマで任意のデータ分割のために働くとあなたが望んで行う必要があります。

DECLARE @query varchar(max), 
    @col varchar(250) = 'd1,d2,d3', @word varchar(250) ='' 


    Set @query = 'INSERT INTO [dbo].[MYTABLE](
       '[email protected]+' 
       )' 
    while CHARINDEX(',', @col)> 1 
    BEGIN 
    set @word = SUBSTRING(@col, 0,CHARINDEX(',', @col)) 
    set @col = SUBSTRING(@col,CHARINDEX(',', @col)+1, LEN(@col)) 
    set @query = @query + 


       ' SELECT ''~N'' AS ['[email protected]+']' 
    END 
    set @query = @query + 


       ' SELECT ''~N'' AS ['[email protected]+']' 

    print @query 
1

あなたのテーブルの出力が間違っているとソリューションのこのタイプはスケールしない、これを避けるために、あなたのスキーマをsimplfyingしてみてください。..

ハイレベルで、これは 1.splittingコンマによって達成することができます列リスト 2.Then行に列を変換返されます区切り値..

デモ:

私は、分割文字列のいずれかを使用functions from here ...

--create table #temp 
--(
--d1 varchar, 
--d2 varchar, 
--d3 varchar 
--) 


declare @q varchar(10) 
set @q='d1,d2,d3' 

;with cte 
as 
(select * from 
[dbo].[SplitStrings_Numbers](@q,',') 
) 
insert into #temp 
select 
max(case when item='d1' then item end) as d1, 
max(case when item='d2' then item end) as d2, 
max(case when item='d3' then item end) as d3 
from cte 
1
DECLARE @query varchar(max), 
`@col varchar(250) = 'd1,d2,d3',` 
`@col1 varchar(250) = ''` 

`Set @query = 'INSERT INTO [dbo].[MYTABLE](` 
       ` '[email protected]+'` 
       ` )' `   


`SELECT @col=COALESCE(@col+',','')` 
` WHILE(CHARINDEX(',',@col) > 0)` 
<br/> 
`BEGIN` 


`SET @col1= left(@col, charindex(',', @col+',')-1)` 
<br/> 
`set @[email protected]+'SELECT ''~N'' AS ['[email protected]+'],'` 
<br/> 
`IF(CHARINDEX(',',@col) > 0)` 
<br/> 
`BEGIN` 
<br/> 
    `SET @col = STUFF(@col, 1, CHARINDEX(',', @col+''), '') ` 
<br/>  
`END` 
<br/> 
`ELSE`<br/> 
`IF(LEN(@col)>0)`<br/> 
`BEGIN`<br/> 
    `SET @col = STUFF(@col, 1,LEN(@col) , '') ` <br/> 

`END`<br/> 
`END`<br/> 
`SET @query = STUFF(@query, len(@query), 1, '') `<br/> 
`print @query` 
0

私の答え

Declare @SQLString varchar(max) 
Declare @SQLString2 varchar(max) 
DECLARE @col_by_dim varchar(8000) = 'd1,d2,d3,d4', 
@dim_name1 varchar(250) = 'CarrierEnrollment' 
Set @SQLString = 'INSERT INTO [dbo].[zzz_'[email protected]_name1+'](
        '[email protected]_by_dim+' 
        ) 
Select ' 


DECLARE @pos INT 
DECLARE @len INT 
DECLARE @value varchar(8000) 

set @pos = 0 
set @len = 0 

WHILE CHARINDEX(',', @col_by_dim, @pos+1)>0 
BEGIN 
    set @len = CHARINDEX(',', @col_by_dim, @pos+1) - @pos 
    set @value = SUBSTRING(@col_by_dim, @pos, @len) 

    set @SQLString2 = ' 
    ''~N'' AS ['[email protected]+'],' 

    set @pos = CHARINDEX(',', @col_by_dim, @[email protected]) +1 
    Set @SQLString = @SQLString + @SQLString2 
END 
print @SQLString + ' 
    ''~N'' AS '+ '['+SUBSTRING(@col_by_dim, @pos, @len)+']' 
+0

と一致していない挿入は、私はそれを考え出した、あなたのすべてに感謝します。 everyonesのおかげで助けてください – cnayak

0
DECLARE @query varchar(max), 
@col varchar(250) = 'd1,d2,d3',@value varchar(max) 


set @query='INSERT INTO [dbo].[MYTABLE](
        '[email protected]+' 
        ) 
        SELECT ' 

declare c cursor for 
select val from Split(@col, ',') 
open c 
fetch next from c into @value 
while @@FETCH_STATUS=0 
begin 

Set @query = @query+ '''~N'''+' AS ['[email protected]+']'+','+CHAR(13)+char(9)+char(9)+char(9)+char(9)+char(9)+char(9)+char(9) 
fetch next from c into @value 
end 
close c 
deallocate c 


set @query= substring(@query,1,len(@query)) 
print @query