SQL:获取2个变量的常用值

时间:2015-02-18 07:41:34

标签: sql sql-server

编辑:我已经改写了原来的问题,以便更好地解释这种情况。

我有什么?

我有一个名为Table1的表,其中有5列A,B,C,D,E。

我需要什么?

现在从这个表中,我只需要选择几个存储在变量@ var1中的列。这个变量@ var1动态变化。

@ var1 =' A,B,F'

SET @sql ='选择' + @ var1 +'来自[表1]

EXEC sp_executesql @sql。

这会导致错误,因为列" F"表格"表1和#34;

中没有

问题:

现在,因为专栏" F"表中没有,我希望输出表只包含A和B列。

我如何得出这样的输出?

/// 如何在sql中将2个变量的常用值转换为另一个变量? 我在两个不同的变量中有一个连接的列名,如下所示 示例:     我在两个不同的变量中有一个连接的列名,如下所示。     变量1:     @ columns1 = [ABC],[EFG],[MNO],[XYZ]     变量2:     @ columns2 = sum([ABC])as [ABC],sum([IJK])as [IJK],sum([MNO])as [MNO] 结果要求:     由于列名[ABC]和[MNO]都存在于两个变量中,因此我的最终输出必须是这样的。     @finalColumns = [ABC],[MNO]

2 个答案:

答案 0 :(得分:1)

首先拆分两个变量中的值

然后比较两个分割的行。然后用逗号连接匹配的行。像这样的东西。

DECLARE @columns1 VARCHAR(max) = '[ABC],[EFG],[MNO],[XYZ]',
        @columns2 VARCHAR(max) = 'Sum([ABC]) as [ABC],sum([IJK]) as [IJK],sum([MNO]) as [MNO]',
        @result varchar(max)

set @result = (SELECT sp_col+','
FROM  (SELECT Split.a.value('.', 'VARCHAR(100)') sp_col
       FROM   (SELECT Cast ('<M>' + Replace(@columns1, ',', '</M><M>')
                            + '</M>' AS XML) AS Data) AS F
              CROSS APPLY Data.nodes ('/M') AS Split(a)) a
WHERE  EXISTS (SELECT sp_col
               FROM  (SELECT Split.a.value('.', 'VARCHAR(100)') sp_col
                      FROM   (SELECT Cast ('<M>' + Replace(@columns2, ',', '</M><M>')
                                           + '</M>' AS XML) AS Data) AS S
                             CROSS APPLY Data.nodes ('/M') AS Split(a))b
               WHERE  Charindex(a.sp_col, b.sp_col) > 0) 
               for xml path(''))

select @result = left(@result,LEN(@result)-1)

select @result  --[ABC],[MNO]

答案 1 :(得分:0)

这是字符串解析的练习,而不是SQL。当然,您可以从互联网上获取其中一个字符串拆分算法并使用它。

declare @columns1 varchar(255) = '[ABC],[EFG],[MNO],[XYZ]';
declare @columns2 varchar(255) = 'SUM([ABC]) as [ABC],sum([IJK]) as [IJK],sum([MNO]) as [MNO]';
declare @p1 int = 0;
declare @p2 int = charindex(',', @columns1 + ',', @p1);
declare @s varchar(32);
declare @out varchar(256) = '';
declare @sep varchar(1) = '';

while @p2 > 0
begin
    set @s = substring(@columns1, @p1+1, @p2-@p1-1);
    if charindex(@s, @columns2) > 0
    begin
        set @out = @out + @sep + @s;
        set @sep = ',';
    end
    set @p1 = @p2;
    set @p2 = charindex(',', @columns1 + ',', @p1+1);
end
print @out