【发布时间】:2021-08-11 22:20:02
【问题描述】:
CREATE PROCEDURE [dbo].[usp_InsertGenerator]
AS
BEGIN
DECLARE @tablename varchar(100)
CREATE TABLE #TempTable
(
Name varchar(max)
)
INSERT INTO #TempTable (Name)
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
SET @tablename = (SELECT name FROM #TempTable)
DECLARE cursCol CURSOR FAST_FORWARD 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.'
CLOSE curscol
DEALLOCATE curscol
RETURN
END
WHILE @@FETCH_STATUS = 0
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
exec (@query)
CLOSE cursCol
DEALLOCATE cursCol
end
end
go
尝试使用所有表格的数据生成脚本。 我需要为数据库中存在的所有表设置@tablename。
DECLARE @tablename varchar(100)
CREATE TABLE #TempTable(
Name varchar(max))
INSERT INTO #TempTable ( Name)
SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE= 'BASE TABLE'
set @tablename=(SELECT name from #TempTable )
执行上述程序时,出现以下错误。 如何在声明相同的变量后为任何变量设置多个值。
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=,
<, <= , >, >= or when the subquery is used as an expression.
【问题讨论】:
-
将所有表中的所有数据插入到单个表中是没有意义的,原因有很多。您真正想在这里实现什么?你想回答什么问题?
-
我想使用过程或查询生成所有包含数据的表的脚本。这就是我使用这个 INSERT INTO #TempTable (Name) SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE= 'BASE TABLE' set @tablename=(SELECT name from #TempTable ) 来获取所有表的名称的原因
-
如果你想为你的数据库和数据编写脚本,这里有很多例子来说明如何做到这一点。虽然为什么不使用备份?
-
我需要使用存储过程或任何查询一次性为所有表生成插入语句。
-
而为什么你需要那个?再说一遍,你真正想解决什么问题?
标签: sql-server