Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-使用不同的数据库重命名存储过程中的列_Sql_Sql Server_Database_Stored Procedures_Sp Rename - Fatal编程技术网

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

SQL Server-使用不同的数据库重命名存储过程中的列,sql,sql-server,database,stored-procedures,sp-rename,Sql,Sql Server,Database,Stored Procedures,Sp Rename,我找了又找,找不出解决问题的方法。实际上我不确定这是否可能,但我想我会在这里发布并检查 问题是: 我有一个存储过程,我在其中进行以下调用(有两个,因为我尝试了不同的事情,但都失败了): 其他选择: SET @olddate = '1606' SET @newdate = '1706' SET @TableName = 'sometablename' SET @old = '[DBName' + @olddate + '.dbo.' + @TableName + @olddate+']."[Col

我找了又找,找不出解决问题的方法。实际上我不确定这是否可能,但我想我会在这里发布并检查

问题是:

我有一个存储过程,我在其中进行以下调用(有两个,因为我尝试了不同的事情,但都失败了):

其他选择:

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(列)错误

现在,我想知道的是:我能做到这一点吗?编写一个存储过程,在一个数据库的表中运行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

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


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

我认为您需要一个动态SQL查询来使用数据库名限定
sp_rename
,并使用
sp_executesql
执行。为什么不简单地
alter proc…
并在您实际拥有的所有数据库上运行它呢[DBName 1606.dbo.sometablename 1606]。这是无效的sql。它应该类似于[DBName][1606].[dbo].[sometablename]参见的答案PlaidDK@plaidDK非常感谢。这样做时,我仍然会遇到这个错误:>要么参数objname不明确,要么声明的objtype(列)错误。但实际上我同时找到了一个解决方案:execute('use otherdb exec sp_rename''the table.[colname]'','newcolname'','COLUMN'')我认为问题在于数据库的更改..我的代码工作正常,我自己测试过它,所以要么是你的变量,要么是你的键入错误。看看sql打印语句,基本上你和我做的一样。您只需在前面加上前缀,而不使用dbname。请将其标记为正确。我想我的问题是,我从另一个数据库中的另一个查询调用了整个存储过程。因此,SQL不知道在哪里查找表。因此,在尝试这种方法时,这对我来说仍然不起作用。在模式名之前,将数据库定义在哪个数据库上并不重要。
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''')