在一个查询中填充两个变量

时间:2019-02-06 11:55:22

标签: sql-server sql-server-2012

我正在编写一个带有枢轴的存储过程。数据透视表字段名称可以更改,具体取决于表中的数据。

所以我下面有两个变量。但是,这似乎效率很低,因为我在同一个表上运行了两个查询,这可能是由于我缺乏知识。

declare @code nvarchar(max) = ''
select @code = @code + '[' + Code + '],' from (select Code from myTbl) as c 
set @code = substring(@code , 1, len(@code ) - 1)

declare @Name nvarchar(max) = ''
select @Name = @Name + '[' + Name + '],' from (select Name from myTbl) as c
set @Name = substring(@Name , 1, len(@Name ) - 1)

是否可以同时填充两个变量并只查询表一次?

2 个答案:

答案 0 :(得分:4)

是的,这是一个简单的示例

CREATE TABLE T(
  Code VARCHAR(45),
  Name VARCHAR(45)
);

INSERT INTO T VALUES
('Code1', 'Name1'),
('Code2', 'Name2');

DECLARE @Code VARCHAR(MAX) = '',
        @Name VARCHAR(MAX) = '';

SELECT @Code = @Code + QUOTENAME(Code) + ',',
       @Name = @Name + QUOTENAME(Name) + ','
FROM T;

SELECT @Code, @Name;

返回:

+------------------+------------------+
| No column name)  | (No column name) |
+------------------+------------------+
| [Code1],[Code2], | [Name1],[Name2], |
+------------------+------------------+

如果您有SQL Server 2017,则无需使用子字符串,只需使用STRING_AGG()作为

SELECT STRING_AGG(QUOTENAME(Code), ','),
       STRING_AGG(QUOTENAME(Name), ',')
FROM T;

返回:

+------------------+------------------+
| (No column name) | (No column name) |
+------------------+------------------+
| [Code1],[Code2]  | [Name1],[Name2]  |
+------------------+------------------+

答案 1 :(得分:3)

我将子查询(从myTbl中选择代码)剥离为c,因为在这种情况下我认为它没有添加任何内容。

给我。我相信它可以像这样工作:

declare @code nvarchar(max) = ''
declare @Name nvarchar(max) = ''

select @code = @code + '[' + Code + '],', @Name = @Name + '[' + Name + '],' from myTbl 

set @code = substring(@code , 1, len(@code ) - 1)
set @Name = substring(@Name , 1, len(@Name ) - 1)