编辑:我已经改写了原来的问题,以便更好地解释这种情况。
我有什么?
我有一个名为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]
答案 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