SQL Server - 使用不同的数据库重命名存储过程中的列

时间:2017-11-07 13:58:52

标签: sql sql-server database stored-procedures sp-rename

我搜索过并搜索过,无法解决如何解决问题。我实际上不确定这是可能的,但我想我会在这里发帖并检查。

问题:

我有一个存储过程,我进行以下调用(有2个因为我尝试了不同的东西,但都失败了):

SET @olddate = '1606'
SET @newdate = '1706'
SET @TableName = 'sometablename'
SET @sql = 'SP_RENAME ''[DBName' + @olddate + '.dbo.' + @TableName + @olddate +'].[ColumnName' + @olddate + 'restofname]'',''[ColumnName' + @newdate + 'restofname]'''
EXECUTE sp_executesql @sql

其他选择:

SET @olddate = '1606'
SET @newdate = '1706'
SET @TableName = 'sometablename'
SET @old = '[DBName' + @olddate + '.dbo.' + @TableName + @olddate+']."[ColumnName' + @olddate + 'restofname]"'
SET @new = 'ColumnName' + @newdate + 'restofname'
EXECUTE sp_rename @objname = @old,@newname = @new, @objtype = 'COLUMN'

我将其保存在存储过程中,然后在另一个具有不同数据库上下文的查询中运行它并且第一个出现以下错误:

  

没有名称为' [DBName.dbo.TableName.ColumnName]'可以在当前数据库' [其他数据库]'中找到,因为@itemtype被输入为'(null)'。

这是第二次:

  

参数@objname不明确或声称@objtype(COLUMN)错误。

现在,我想知道的是:我甚至可以这样做吗?编写一个存储过程,在一个数据库的表中运行sp_rename,然后从另一个数据库调用该存储过程?

我还尝试了打开和关闭括号的所有排列,[和]我的新旧列名称的部分内容。还尝试在字符串前面加上N.虽然它有点试验和错误,但迄今为止没有任何效果。

3 个答案:

答案 0 :(得分:1)

您不能将DBName和schemaName和tablename放在一个括号[]中。您需要用括号括起每个。并且不要在新名称周围使用括号,因为它会将这些括号放入名称中。它是一个字符串,所以你可以在你的名字中放置空格和你喜欢的东西。

declare @TableName nvarchar(max)
declare @ColumName nvarchar(max)
declare @NewColumn nvarchar(max)
declare @sql nvarchar(max)

SET @NewColumn = 'newtest'
SET @ColumName = 'test'
SET @TableName = 'trassor'

SET @sql = 'SP_RENAME ''[YOURDBNAME].[YOURSCHEMANAME].['+ @TableName +'].['+@ColumName+']'', '''+@NewColumn+''', ''COLUMN'''

/* SET @sql = 'SP_RENAME ''[LegogSpass].[dbo].['+ @TableName +'].['+@ColumName+']'', '''+@NewColumn+''', ''COLUMN''' */

PRINT @SQL
EXECUTE sp_executesql @sql

答案 1 :(得分:0)

首先在sp_executesql语句之前使用select @sql查询来查看动态语句的形成方式。

这可以让您了解错误。

在您的情况下,括号放置错误。 删除它们或单独添加到dbname,schemaname,tablename和column。

此外,您错过了sp_rename语句末尾的“列”。

declare @sql nvarchar(max),@olddate varchar(10),@newdate varchar(10),@TableName varchar(100)
SET @olddate = '1606'
SET @newdate = '1706'
SET @TableName = 'sometablename'
SET @sql = 'SP_RENAME ''DBName' + @olddate + '.dbo.' + @TableName + @olddate +'.ColumnName' + @olddate + 'restofname'',''ColumnName' + @newdate + 'restofname'',''Column'''
select @sql
EXECUTE sp_executesql @sql

答案 2 :(得分:0)

感谢所有帮助。我实际上后来想出了这个问题。我知道括号错了,但这不是问题(因为我尝试了各种不同的括号组合,但没有一个工作)。

set @old = @TableName +'.[ColumnName' + @olddate + 'restofname]'
set @new = 'ColumnName' + @newdate + 'restofname'
execute ('use DBName exec sp_rename ''' + @old + ''', ''' + @new + ''', ''COLUMN''') 

诀窍是在execute语句中包含“Use Database”。