【发布时间】:2021-05-25 10:12:58
【问题描述】:
CREATE PROC [dbo].[usp_InsertGenerator]
AS
BEGIN
DECLARE @tablename varchar(max)
DECLARE cursCol1 CURSOR FOR
SELECT name FROM sys.tables
OPEN cursCol1
FETCH NEXT FROM cursCol1 INTO @tablename
DECLARE cursCol CURSOR FOR
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = @tableName
OPEN cursCol
DECLARE @string nvarchar(3000)
DECLARE @stringData nvarchar(3000)
DECLARE @dataType nvarchar(1000)
SET @string='INSERT '+@tableName+'('
SET @stringData=''
DECLARE @colName nvarchar(50)
FETCH NEXT FROM cursCol INTO @colName,@dataType
IF @@fetch_status<>0
BEGIN
PRINT 'Table '+@tableName+' not found, processing skipped.'
--FETCH NEXT FROM cursCol1 INTO @tablename
CLOSE curscol
DEALLOCATE curscol
RETURN
END
WHILE @@FETCH_STATUS=0
--FETCH NEXT FROM cursCol1 INTO @tablename
BEGIN
IF @dataType in ('varchar','char','nchar','nvarchar')
BEGIN
SET @stringData=@stringData+'''''''''+
isnull('+@colName+','''')+'''''',''+'
END
ELSE
BEGIN
SET @stringData=@stringData+'''''''''+
isnull(cast('+@colName+' as varchar(200)),''0'')+'''''',''+'
END
SET @string=@string+@colName+','
FETCH NEXT FROM cursCol INTO @colName ,@dataType
END
BEGIN
DECLARE @Query nvarchar(4000)
SET @query ='SELECT '''+substring(@string,0,len(@string)) + ')
VALUES(''+ ' + substring(@stringData,0,len(@stringData)-2)+'''+'')''
FROM '+@tableName
PRINT (@query)
CLOSE cursCol1
DEALLOCATE cursCol1
CLOSE cursCol
DEALLOCATE cursCol
END
END
GO
执行过程时,我只从sys.tables 的名称列中获取第一个值(行)。
我希望它用于sys.tables 中的所有行。
查询应该一个一个地获取每个表名,然后对每个表执行查询,以便我可以获得所有表的插入语句。
提前致谢。
【问题讨论】:
-
如果您想要第一行,则使用
TOP 1并添加ORDER BY以保证结果一致。但你是already told this。 -
@Larnu 我不想要第一行。我希望对每一行一个一个地执行这个查询。
-
但是,你又想在这里重新发明轮子。您显然不熟悉 T-SQL,因此您不应该尝试这项任务。如果您正在寻找它们,那么已经有解决方案了。
-
你从来没有回答过why 你想这样做... SQL Server 中已经存在的备份解决方案有什么问题?我不怀疑我们这里有一个XY Problem。
标签: sql sql-server tsql