我正在编写一个带有枢轴的存储过程。数据透视表字段名称可以更改,具体取决于表中的数据。
所以我下面有两个变量。但是,这似乎效率很低,因为我在同一个表上运行了两个查询,这可能是由于我缺乏知识。
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)
是否可以同时填充两个变量并只查询表一次?
答案 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)