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喜欢将值一一插入到每个表中,并且它们依赖于表列的数据类型,所以我不能只对所有语句进行一揽子插入)。
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)