2017-04-03 23 views
3

マルチスキーマデータベース での使用このスクリプトは、私はこのエラーを受け取ったとき、私は、SQLで2 charachterを交換しようとしている:無効なオブジェクト名「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は、table_schemaをすぐに利用できるsys.tablesまたはInformation_Schema.tablesを使用することを提案しました。 –

+0

コードをテストしませんでした。コードを印刷し、必要な更新スクリプトを生成するかどうかを確認してください。 –

+0

メッセージ208、レベル16、行1 無効なオブジェクト名 'Pay.PayPersonAccounts'。 メッセージ16924、レベル16、状態1、行26 カーソル・フェッチ:INTOリストで宣言された変数の数は、選択した列のものと一致する必要があります。 –

1

あなたは、スキーマとの完全なテーブル名を使用する必要があります。そして、タブー名を囲むようにしてください。テーブルのsys.tablesも使用してください。 sys.tables

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

関連する問題