заполнить две переменные в одном запросе - PullRequest
0 голосов
/ 06 февраля 2019

Я пишу хранимую процедуру с опорой в ней.Имена сводных полей могут меняться в зависимости от данных в таблице.

Итак, у меня есть две переменные ниже.Однако это кажется довольно неэффективным, потому что я выполняю два запроса к одной и той же таблице, вероятно, из-за недостатка знаний.

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 голосов
/ 06 февраля 2019

Я сократил подзапрос (выберите Код из 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)
0 голосов
/ 06 февраля 2019

Да, вы можете, вот простой пример

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]  |
+------------------+------------------+
...