【问题标题】:SQL Server - rename column within stored procedure with different databasesSQL Server - 使用不同数据库重命名存储过程中的列
【发布时间】:2017-11-07 13:58:51
【问题描述】:

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

问题:

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

【问题讨论】:

  • 我认为您需要一个动态 SQL 查询来使用数据库名称限定 sp_rename 并使用 sp_executesql 执行。
  • 为什么不简单的alter proc... 并在所有数据库上运行它
  • 您实际上拥有 [DBName 1606.dbo.sometablename 1606]。这不是有效的 sql。它应该类似于 [DBName] [1606].[dbo].[sometablename] 另见 PlaidDK 的答案

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


【解决方案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

【讨论】:

  • @plaidDK 非常感谢。这样做时我仍然会收到此错误:>参数 objname 不明确或声明的 objtype (COLUMN) 错误。但实际上我同时找到了一个解决方案:execute ('use otherdb exec sp_rename ''thetable.[colname]'', ''newcolname'', ''COLUMN''') 我认为问题是数据库更改..
  • 我的代码有效,我自己测试过,所以要么是你的变量,要么是你的输入错误。看sql打印语句
  • 基本上你做的和我一样。您只是没有 dbname 的前缀。请标记为正确
  • 我认为我的问题是我从另一个数据库中的另一个查询中调用了整个存储过程。因此,SQL 不知道在哪里查找表。所以这对我来说仍然没有用。
  • @AmyClark 在架构名之前定义数据库时,您使用哪个数据库并不重要。
【解决方案2】:

首先在 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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 2020-03-03
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多