2017-04-03 158 views
3

我试图替代两个charachter在SQL中,当使用该脚本在多模式数据库 我收到此错误:无效的对象名称TABLE_2“

消息208,级别16,状态1,行1无效的对象名称 'PayPersonAccounts'。消息208,级别16,状态1,行1无效对象 名称'PayPersonAccounts'。消息208,级别16,状态1,行1无效 对象名称 'CMRDirectDeliveryPartHeader'

USE Test 
DECLARE @Table NVARCHAR(MAX),@Column NVARCHAR(MAX) 
DECLARE Table_Cursor CURSOR 
FOR 

SELECT T.name, /* Table */ 
     C.name /* Column */ 
FROM sysobjects T,syscolumns C 
WHERE T.id = C.id AND T.xtype = 'u' /* User Table */ 
        AND (C.xtype = 99 /* ntext */ 
        OR C.xtype = 35 /* text */ 
        OR C.xtype = 231 /* nvarchar */ 
        OR C.xtype = 167 /* varchar */ 
        OR C.xtype = 175 /* char */ 
        OR C.xtype = 239 /* nchar */) 

OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @Table,@Column 
WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    EXEC ('Update [' + @Table + '] Set [' + @Column + '] = REPLACE(REPLACE(CAST([' + @Column + '] as nvarchar(max)), NCHAR(1610), NCHAR(1740)), NCHAR(1603), NCHAR(1705))') 
FETCH NEXT FROM Table_Cursor INTO @Table,@Column 
END CLOSE Table_Cursor 
DEALLOCATE Table_Cursor 
+0

可以检查模式名称?可能的架构可能会有所不同.. –

+1

总是最好使用schemaname.tablename –

+1

小评论:你将如何处理计算列?他们也在这里被选中。如果可以,请使用'QUOTENAME'和'CONCAT'。只是看起来很整洁。 – Jens

回答

3

我觉得你SCHEMANAME丢失..尝试选中此更改的查询

USE Test 
DECLARE @SchemaName SYSNAME, @Table NVARCHAR(MAX),@Column NVARCHAR(MAX) 
DECLARE Table_Cursor CURSOR 
FOR 

SELECT s.Name --schemaname 
    , T.name, /* Table */ 
     C.name /* Column */ 
FROM sysobjects T inner join 
syscolumns C on 
T.id = C.Id 
inner join sys.schemas s 
on T.uid = s.schema_id 
where T.xtype = 'u' /* User Table */ 
        AND (C.xtype = 99 /* ntext */ 
        OR C.xtype = 35 /* text */ 
        OR C.xtype = 231 /* nvarchar */ 
        OR C.xtype = 167 /* varchar */ 
        OR C.xtype = 175 /* char */ 
        OR C.xtype = 239 /* nchar */) 

OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @SchemaName, @Table, @Column 
WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    EXEC ('Update [' + @SchemaName + '].[' + @Table + '] Set [' + @Column + '] = REPLACE(REPLACE(CAST([' + @Column + '] as nvarchar(max)), NCHAR(1610), NCHAR(1740)), NCHAR(1603), NCHAR(1705))') 
FETCH NEXT FROM Table_Cursor INTO @SchemaName, @Table,@Column 
END CLOSE Table_Cursor 
DEALLOCATE Table_Cursor 
+0

由于Matias建议您可以使用sys.tables或Information_Schema.tables,您可以随时使用table_schema –

+0

未测试代码 - 尝试打印代码并检查它是否生成您所需的更新脚本 –

+0

Msg 208,Level 16,State 1,第1行 无效的对象名称“Pay.PayPersonAccounts”。 消息16924,级别16,状态1,行26 Cursorfetch:在INTO列表中声明的变量数量必须与选定列的变量数量相匹配 –

1

您需要与架构使用完整的表名。并且确定附上Tabe名称。同样使用sys.tables表格: sys.tables

QUOTENAME(SCHEMA_NAME(t.schema_id))+'。' + QUOTENAME(T.name)