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



我已经搜索了又搜索,无法找到如何解决我的问题。事实上,我不确定这是否可能,但我想我会在这里张贴并检查。

问题:

我有一个存储过程,我在其中进行以下调用(有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'

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

在当前数据库'[Other database]'中找不到名为'[DBName.dbo.TableName.ColumnName]'的项,因为@itemtype输入为"(null)"。

这是第二个:

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

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

我还尝试了在新旧列名的部分周围放置开括号和闭括号的每一种排列方式。还试着把N放在字符串之前。不过,这是一个反复试验的过程,到目前为止一切都没有奏效。

您不能将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

首先,在sp_executesql语句之前使用select@sql查询来查看动态语句是如何形成的。

这样可以让您了解错误。

在你的情况下,括号的放置方式不对。删除它们,或者分别添加到dbname、schemaname、tablename和column。

此外,sp_rename语句末尾缺少"column"。

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

感谢您的帮助。事实上,我后来发现了这个问题。我知道括号是错的,但这不是问题所在(因为我尝试了各种不同的括号组合,但都不起作用)。

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

诀窍是在execute语句中包含"使用数据库"。

最新更新