Как перебирать таблицы в схеме с помощью динамического Sql
У меня есть база данных таблиц, и я хочу перебирать каждую таблицу в 3 разных схемах, по одной схеме за раз.
Я думаю, что мне понадобится что-то вроде:
DECLARE @tableName varchar(50)
DECLARE @schemaName varchar(50)
Пока назовем схемы "А", "В"и " с".
Я могу получить список таблиц из каждой схемы, используя:
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';
Но я не знаю, как перебирать этот список (мне нравится вставлять значения в каждую таблицу по одному, и они зависят от типа данных столбцы таблиц, так что я не могу просто сделать общую вставку во все инструкции).
1 ответ:
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