2

一度に複数のSQLServer2008R2テーブルを変更しようとしています。

これは私のコードです:

use DatabaseName
go

Declare @SchemaUsed varchar(20) = 'dbo'

create table #Tables
(
  TableName varchar(100), Processed int
)

insert into #Tables 
  select top 1 table_name, 0  
  from INFORMATION_SCHEMA.TABLES 
  where TABLE_SCHEMA = @SchemaUsed
  and table_type = 'Base Table'
  and (TABLE_NAME like 'PM%' )
  ORDER BY TABLE_NAME

DECLARE @TableName varchar(max)
DECLARE @SQL varchar(max)

WHILE EXISTS (select top 1 'x' from #Tables where Processed = 0)
BEGIN
    SET @TableName = (select top 1 TableName from #Tables where Processed = 0)

  Set @SQL = 'ALTER TABLE ' + @SchemaUsed + '.' + @TableName + ' ADD [identityID]  bigint IDENTITY(1, 1) NOT NULL '
 -- Set @SQL =     '''' + @SQL + ''''
  Print @SQL
 EXEC  @SQL;

    update #Tables
    set Processed = 1
    where TableName = @TableName
END

drop table #Tables

私の命を救うためにこれを機能させることができず、次のエラーが発生します:

ルックアップエラー-SQLServerデータベースエラー:名前'ALTER TABLE dbo.PM1GTVLV ADD [identityID] bigint IDENTITY(1、1)NOTNULL'は有効な識別子ではありません。

また、複数の文字列のバリエーションを試しsp_executesql、同様に使用しました。

誰かが私が間違っているところを指摘できますか?

4

2 に答える 2

3

試す

DECLARE @SQL NVARCHAR(MAX);

EXEC sp_executesql @SQL;

EXEC@sqlの代わりに。

余談ですが、これは同じコードIMHOのはるかに使いやすいバージョンです。

DECLARE @SchemaUsed VARCHAR(20) = 'dbo';

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += CHAR(13) + CHAR(10) + N'ALTER TABLE ' 
 + QUOTENAME(@SchemaUsed) + '.'
 + QUOTENAME(name) + ' ADD [identityID]
   BIGINT IDENTITY(1,1) NOT NULL;'
FROM sys.tables
WHERE SCHEMA_NAME([schema_id]) = @SchemaUsed
AND name LIKE 'PM%';

PRINT @sql;

--EXEC sp_executesql @sql;

またはさらに良い:

DECLARE @SchemaUsed VARCHAR(20) = 'dbo';

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += CHAR(13) + CHAR(10) + N'ALTER TABLE ' 
 + QUOTENAME(@SchemaUsed) + '.'
 + QUOTENAME(name) + ' ADD [identityID]
   BIGINT IDENTITY(1,1) NOT NULL;'
FROM sys.tables AS t
WHERE SCHEMA_NAME([schema_id]) = @SchemaUsed
AND name LIKE 'PM%'
AND NOT EXISTS (SELECT 1 FROM sys.columns AS c
 WHERE [object_id] = t.[object_id]
 AND c.is_identity = 1);

PRINT @sql;

--EXEC sp_executesql @sql;
于 2012-07-12T16:39:42.403 に答える
1

文字列を実行するには、 BOL構文EXECに示すように、文字列(または文字変数)を括弧で囲む必要があります。

EXEC (@SQL);
于 2012-07-12T16:42:01.210 に答える