如何使用动态 Sql 迭代模式中的表

Jac*_*ley 4 sql sql-server loops dynamic-sql

我有一个表数据库,我想迭代 3 个不同模式中的每个表,一次一个模式。

我想我需要一些类似的东西:

DECLARE @tableName varchar(50)

DECLARE @schemaName varchar(50)
Run Code Online (Sandbox Code Playgroud)

现在我们将模式称为“A”、“B”和“C”。

我可以使用以下命令从每个模式中获取表的列表:

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';
Run Code Online (Sandbox Code Playgroud)

但我不确定如何迭代该列表(id喜欢将值一一插入到每个表中,并且它们依赖于表列的数据类型,所以我不能只对所有语句进行一揽子插入)。

Mat*_*att 6

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
Run Code Online (Sandbox Code Playgroud)