【问题标题】:How to iterate through tables in a schema with Dynamic Sql如何使用 Dynamic Sql 遍历模式中的表
【发布时间】:2016-08-26 21:31:52
【问题描述】:
我有一个表数据库,我想以 3 个不同的模式遍历每个表,一次一个模式。
我认为我需要一些类似的东西:
DECLARE @tableName varchar(50)
DECLARE @schemaName varchar(50)
现在让我们将模式称为“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';
但我不确定如何遍历该列表(id 喜欢将值一一插入到每个表中,并且它们取决于表列的数据类型,所以我不能只对所有表进行一揽子插入陈述)。
【问题讨论】:
标签:
sql
sql-server
loops
dynamic-sql
【解决方案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