0

次のような2つの変数があります。

@FieldName 
@values

これら 2 つの変数は、次のような値を保持します。

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

'b'ここで、列&'d'のみのデータを取得する必要があります。

どうすれば入手できb=6 & d=8ますか?

前もって感謝します。

4

2 に答える 2

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

または、さらに良いことに、個別のリストではなく、xml形式でパラメーターをspに渡すことができます。

于 2012-10-22T05:24:36.453 に答える
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
于 2012-10-22T06:06:13.950 に答える