【问题标题】:concatenate String with Int in column将字符串与列中的 Int 连接起来
【发布时间】:2018-06-21 17:48:17
【问题描述】:

我需要动态循环列名并获取记录。

下面是我的表,我使用的是 SQL Server 2017。

-- DECLARE @cnt INT = 1;

-- WHILE @cnt < 3
-- BEGIN
--     SELECT 'Name' + @cnt FROM Emp
--     SET @cnt = @cnt + 1;
-- END;
--GO

但此查询不起作用。

如何循环遍历Name+@cnt等列?

预期输出:

User1
User2
User3

Emp表:

【问题讨论】:

  • 修复您的数据,使不同的列组位于不同的行中。
  • 您可以使用动态 SQL 并以这种方式构建选择,但我认为它的设计方式更成问题,应该为每个不同的名称/地址编号提供一个查找表
  • 表结构奇怪。输入表中大概有超过 1 条记录?您是否希望输出是每个输入记录的单行文本,包含三个名称?
  • @JohnRC 是的,这很奇怪,问题是我应该使用这张桌子。我希望每行都有记录。
  • 您需要dynamic sql 才能为您的对象名称(表、列、数据库)使用变量。我同意@GordonLinoff 的观点,即您的架构不是很好,这导致您找到了这个相当复杂的解决方案。

标签: sql sql-server database sql-server-2012


【解决方案1】:
DECLARE @statement NVARCHAR(MAX) = '', @cnt INT = 1;

WHILE @cnt < 4
BEGIN
   SET @statement = @statement + ' select Name' + CAST(@cnt AS VARCHAR) + ' from Emp;'
   SET @cnt = @cnt + 1;
END

EXECUTE sp_executesql @statement

【讨论】:

    【解决方案2】:

    动态 SQL 最适合这项任务:

    declare @sql varchar(1000) = '';
    select @sql = @sql + ' select ' + name + ' from MYDATABASE.dbo.Emp ' from MYDATABASE.sys.columns
    where name like 'Name[1-3]'
    
    exec(@sql)
    

    查询将搜索Name1Name2Name3 等列名,并构造三个SELECT 查询,然后由EXEC 函数执行。

    注意:我假设该表位于 dbo 架构中,您需要使用您的数据库而不是 MYDATABASE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多