Sql 如何将n个列名分配到单个变量中?
我有一个映射表,其中包含SourceFields、TargetFields和文件名的列表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
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';