【问题标题】: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