0

我已经搜索和搜索,无法解决我的问题。我实际上不确定这是否可能,但我想我会在这里发布并检查。

问题:

我有一个存储过程,我在其中进行了以下调用(有 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 放在字符串之前。虽然这有点反复试验,但到目前为止没有任何效果。

4

3 回答 3

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
于 2017-11-07T14:13:55.183 回答
0

感谢所有的帮助。我实际上后来发现了这个问题。我知道括号是错误的,但这不是问题(因为我尝试了各种不同的括号组合,但都没有奏效)。

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

诀窍是在执行语句中包含“使用数据库”。

于 2017-11-10T07:35:42.977 回答
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
于 2017-11-07T14:32:00.157 回答