2012-10-22 20 views
0

我有兩個變量,如:檢索從單一的SQL Server可變數據的多條

@FieldName 
@values 

這兩個變量保存值,如:

  • @FieldName - 包含[a],[b],[c],[d]
  • @values - 包含5,6,7,8

現在我只需要檢索'b' & 'd'列的數據。

我們怎樣得到b=6 & d=8

在此先感謝。

+0

您是否在其他地方形成這些變量的值並將它們傳遞給此存儲過程? – Vikdor

+0

基本上,從一個長存儲過程使用select命令我得到這些值。現在需要拆分字段和值。我不會將該參數傳遞給任何地方。只需使用它創建INSERT/UPDATE命令 – riad

+1

如果您使用的是SQL Server 2005或更高版本,我推薦使用XML來保存這些值,這樣可以更輕鬆地直接生成結果集插入/更新到表格中。 – Vikdor

回答

1

好,我討厭做的SQL Server這樣的事情,但

declare @FieldName nvarchar(max) = '[a],[b],[c],[d]' 
declare @values nvarchar(max) = '5,6,7,8' 
declare @i int, @j int, @break int 
declare @a nvarchar(max), @b nvarchar(max), @result nvarchar(max) 

select @break = 0 

while @break = 0 
begin 
    select @i = charindex(',', @FieldName), @j = charindex(',', @values) 

    if @i > 0 and @j > 0 
    begin 
     select @a = left(@FieldName, @i - 1), @b = left(@values, @j - 1) 

     select @FieldName = right(@FieldName, len(@FieldName) - @i), @values = right(@values, len(@values) - @j) 
    end 
    else 
    begin 
     select @a = @FieldName, @b = @values, @break = 1 
    end 

    if @a in ('[b]', '[d]') 
     select @result = isnull(@result + ' & ', '') + @a + '=' + @b 

select @result 

你也可以把所有該列表分爲臨時/變量表和做加盟。

select * 
from 
(
    select T.<yourcolumn>, row_number() over (order by T.<yourcolumn>) as rownum 
    from <temptable1> as T 
) as F 
    inner join 
    (
     select T.<yourcolumn>, row_number() over (order by T.<yourcolumn>) as rownum 
     from <temptable2> as T 
    ) as V on V.rownum = F.rownum 

,或者甚至更好,你可以傳遞參數到SP的XML格式,而不是在不同的名單

+0

非常感謝bro.its正常工作 – riad

1

試試這個:
使用XML我正在試圖灑的價值和存儲結果在表變量

DECLARE @FieldName VARCHAR(MAX), 
    @values varchar(max) 

    SET @FieldName = 'a,b,c,d'; 
    SET @values = '5,6,7,8' 

    SET @FieldName = @FieldName + ','; 
    SET @values = @values + ','; 

    DECLARE @X XML 
    SET @X = CAST('<Item>' + REPLACE(@FieldName, ',', '</Item><Item>') + '</Item>' AS XML) 

    Declare @X1 XML 
    Set @X1=CAST('<Position>' + REPLACE(@values, ',', '</Position><Position>') + '</Position>' AS XML) 

    Declare @FieldSample table 
    (
    FieldName char(1), 
    rowNum int 
    ) 

    Declare @valueSample table 
    (position int, 
    rowNum int) 

    Insert into @FieldSample(rowNum,FieldName) 
    Select * from (
    SELECT row_number() over (order by (select 0)) as rowNum, t.value('.', 'char(1)') as field 
    FROM @x.nodes('/Item') as x(t) 
    ) as a 
    where a.field !='' 

    Insert into @valueSample(rowNum,position) 
    Select * from (
    Select row_number() over (order by (select 0)) as rowNum, k.value('.', 'int') as position 
    from @X1.nodes('/Position') as x1(k) 
    ) as b 
    where b.position !=0 

基本上最後的邏輯,您可以在根據您打算如何獲取數據變更

Select a.FieldName,b.position from @FieldSample as a 
    inner join @valueSample as b 
    on a.rowNum=b.rowNum 
    where b.position = 6 or b.position =8 
+0

不錯的解決方案.. – riad

相關問題