代码之家  ›  专栏  ›  技术社区  ›  mHelpMe

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

  •  3
  • mHelpMe  · 技术社区  · 6 年前

    我正在编写一个包含枢轴的存储过程。数据透视字段名称可以根据表中的数据而更改。

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

    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 回复  |  直到 6 年前
        1
  •  4
  •   Ilyes    6 年前

    是的,你可以,这是一个简单的例子

    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]  |
    +------------------+------------------+
    
        2
  •  3
  •   Ben Ootjers    6 年前

    我已经将子查询(从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)