2016-08-26 6 views
2

私はテーブルのデータベースを持っていますが、私は3つの異なるスキーマの各テーブルを一度に1つずつスキップしたいと思います。Dynamic Sqlを使用してスキーマ内のテーブルを反復する方法

は、私は私がの線に沿って何かをする必要がありますことを把握:今のところ

DECLARE @tableName varchar(50) 

DECLARE @schemaName varchar(50) 

は「B」と「C」「A」スキーマを呼び出すことができます。

SELECT t.name 
    FROM sys.tables AS t 
    INNER JOIN sys.schemas AS s 
    ON t.[schema_id] = s.[schema_id] 
    WHERE s.name = N'schema_name'; 

をしかし、idが1で、すべてのテーブル1にして値を挿入したい(そのリストを反復処理する方法がわからないイム、彼ら:

私が使用して、各スキーマからテーブルの一覧を取得することができますテーブルの列のデータ型に依存しているので、すべてのステートメントにブランケット挿入を行うことはできません)。

+2

これは 'CURSOR'の適切な使用例です。ドキュメントを読んでください:https://msdn.microsoft.com/en-us/library/ms180169.aspx – squillman

答えて

2
DECLARE @SchemaName SYSNAME = 'dbo' 

DECLARE @TableName SYSNAME 
--note sysname is the same thing as NVARCHAR() 

DECLARE CursorName CURSOR FOR 
SELECT t.name 
    FROM sys.tables AS t 
    INNER JOIN sys.schemas AS s 
    ON t.[schema_id] = s.[schema_id] 
    WHERE s.name = @SchemaName; 

OPEN CursorName 

FETCH NEXT FROM CursorName 
INTO @TableName 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 

     DECLARE @Columns NVARCHAR(MAX) 
     SET @Columns = 
     STUFF(
      (SELECT 
      ',' + QUOTENAME(name) 
      FROM 
      sys.columns 
      WHERE 
      object_id = OBJECT_ID(QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName)) 
      FOR XML PATH('')) 
      ,1,1,'') 

     DECLARE @SQL AS NVARCHAR(MAX) 
     SET @SQL = 'INSERT INTO ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + 
        ' (' + @Columns + ') VALUES (' + 
        'YOU MAKE REST DEPENDING ON YOUR NEEDS' 

     --use print to view and copy your dynamic sql string to see if you have formed it correctly 
     PRINT @SQL 
     --EXECUTE (@SQL) 

     FETCH NEXT FROM CursorName 
     INTO @TableName 
    END 

CLOSE CursorName 
DEALLOCATE CursorName 
関連する問題