Sql 如何将n个列名分配到单个变量中?

Sql 如何将n个列名分配到单个变量中?,sql,sql-server,Sql,Sql Server,我有一个映射表,其中包含SourceFields、TargetFields和文件名的列表 SourceField TargetField Filename A 1 test.xlsx B 2 test.xlsx C 3 test.xlsx d 1 other.xlsx e 2 other.xlsx

我有一个映射表,其中包含SourceFields、TargetFields和文件名的列表

SourceField TargetField Filename

A           1           test.xlsx
B           2           test.xlsx
C           3           test.xlsx
d           1           other.xlsx
e           2           other.xlsx
我想根据TargetField和FileName设置一个SourceField变量`

        DECLARE
            @FileName NVARCHAR(MAX)                         
            ,@sql1Target NVARCHAR(MAX)
            ,@sql2Target NVARCHAR(MAX)
        -------------------------------------------------------------------------------
            ,@sql1Source NVARCHAR(MAX)                  
            ,@sql2Source NVARCHAR(MAX)
        -------------------------------------------------------------------------------
            ,@sql1Transform NVARCHAR(MAX)               
            ,@sql2Transform NVARCHAR(MAX)

        SET @FileName = 'other.xlsx'                        
        SET @sql1Target = '1'                   
        SET @sql2Target = '2'

        SET @sql1Transform =                            
            'SELECT
                @SourceField = SourceField
            FROM
                MAPPING_DIM
            WHERE
                TargetField = ''1'' and FileName = ' + ''''+ @FileName +''''
        ------------------------------------------------------------------------------------------------------------
        SET @sql2Transform =
                'SELECT
                    @SourceField = SourceField
                FROM
                    MAPPING_DIM
                WHERE
                    TargetField = ''2'' and FileName = ' + ''''+ @FileName +''''
执行这些语句时,将基于其他两个变量返回SourceField。然后,我可以使用这些源变量从我的文件名中进行选择

        EXECUTE sp_executesql @sql1Transform , N'@SourceField NVARCHAR (MAX) OUTPUT', @SourceField = @sql1Source OUTPUT
        EXECUTE sp_executesql @sql2Transform , N'@SourceField NVARCHAR (MAX) OUTPUT', @SourceField = @sql2Source OUTPUT
我希望能够对包含任意列数的任何表执行此操作。目前我的问题是,只有当我的文件名为'other.xlsx'时,我设置了TargetVariables,这段代码才会起作用。如果我在文件名为'test.xlsx'的地方这样做,那么我需要将变量设置为包含第三个字段


是否有任何方法可以根据表中“n”个列的TargetFields和文件名返回SourceFields?

这对于注释来说太长了。我认为没有一种简单的方法可以将任意一组值分配给查询结果

实际上,我建议您使用单独的查询设置每个值:

select @a = TargetField
from mapping
where filename = @filename and sourcefield = 'A';

select @b = TargetField
from mapping
where filename = @filename and sourcefield = 'B';

select @c = TargetField
from mapping
where filename = @filename and sourcefield = 'C';
如果没有对应的行,则不会更改该值。但是,您可以使用聚合强制值为
NULL
或其他一些值:

select @a = max(TargetField)
from mapping
where filename = @filename and sourcefield = 'A';
或:

select@a=coalesce(最大值(TargetField),“”)
从映射
其中filename=@filename和sourcefield='A';

注意:这需要知道所有可能设置的值。但是,它不需要动态SQL。而且,如果要使用这些值,那么您需要知道后续代码中变量的名称。

您使用的是哪种dbms?
select @a = coalesce(max(TargetField), '<default value>')
from mapping
where filename = @filename and sourcefield = 'A';