【问题标题】:Dynamic SQL and loop challenge, SQL Server 2012动态 SQL 和循环挑战,SQL Server 2012
【发布时间】:2015-06-16 09:04:07
【问题描述】:

我有 n 个在运行前未知的表,其中 tablename 始终为 tablename1、tablename2...tablenameN。每个表的第一列始终是名称。挑战是将每个表中的列名更改为 Name1、Name2.. NameN。我知道我应该使用 sp_rename 和一个循环。在构建查询时遇到问题,我对 SQL 很陌生。帮助将不胜感激。谢谢

【问题讨论】:

  • 您是否发现任何有用的答案?
  • 当您不发布任何代码时,很难说您的尝试有什么问题。

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


【解决方案1】:

这应该进行重命名:

DECLARE @counter INT;
DECLARE @tableName NVARCHAR(100);
DECLARE @columnName NVARCHAR(100);
DECLARE @newColumnName NVARCHAR(100);

SET @counter = 1;
WHILE @counter < 65536
BEGIN
    SET @tableName = 'tableName' + CAST(@counter AS NVARCHAR)

    IF EXISTS(SELECT * FROM sys.tables WHERE name = @tableName)
    BEGIN
        SET @columnName = @tableName + N'.name';
        SET @newColumnName = N'name' + CAST(@counter AS NVARCHAR);
        EXEC sp_rename @objname=@columnName, @newName=@newColumnName;
    END
    ELSE
    BEGIN
        SET @counter = 65536
    END

    SET @counter = @counter + 1
END

虽然有点粗略.. 并且仅重命名 65535 个表,并且仅在两者之间没有丢失时才重命名。

【讨论】:

    【解决方案2】:

    当您确定它符合您的预期时取消注释 sql_exec :)

    DECLARE @TableName sysname, @ColName sysname
    DECLARE @num sysname
    DECLARE @sql nvarchar(4000)
    DECLARE cTables CURSOR FOR SELECT name from dbo.sysobjects where Category = 0 AND type NOT IN (N'F', N'FN', N'IF', N'TF', N'P', N'TR', N'V', N'K') AND name like 'tablename%'
    OPEN cTables
    FETCH NEXT FROM cTables INTO @TableName
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @num = SUBSTRING(@Tablename, 10, 5)
        SET @sql = N'sp_RENAME ''' + @TableName + '.[Name]'' , ''[Name' + @num + ']'', ''COLUMN'''
        PRINT @sql
    --  EXEC sp_sqlexec @sql
        FETCH NEXT FROM cTables INTO @TableName
    END
    
    CLOSE cTables;
    DEALLOCATE cTables;
    

    【讨论】:

      【解决方案3】:

      这是一个 SP - 试试看 ;-)

      CREATE PROCEDURE dbo.Rename
      (
          @n INT
      )
      AS
      BEGIN
          SET NOCOUNT ON
      
          DECLARE @Stmt NVARCHAR(MAX)
          DECLARE @i INT
          DECLARE @tabname NVARCHAR(MAX)
          DECLARE @colname NVARCHAR(MAX)
      
          SET @i = 1
      
          WHILE @i <= @n
          BEGIN
              SET @tabname = N'tablename' + CAST(@i AS NVARCHAR(MAX)) 
              SET @colname = N'name' + CAST(@i AS NVARCHAR(MAX))  
      
              IF EXISTS(SELECT TOP 1 1 FROM sys.tables t WHERE t.name = @tabname)
              BEGIN
                  SET @Stmt = N'EXEC sp_rename ''' + @tabname + '.[name]'', ''' + @colname +''',''COLUMN'''
                  --PRINT @Stmt
                  EXEC sp_executesql @Stmt
              END
      
              SET @i = @i + 1
          END
      END
      

      【讨论】: