【问题标题】:Need generate script with data for all the tables in one go [duplicate]需要一次性为所有表生成包含数据的脚本[重复]
【发布时间】: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


【解决方案1】:

添加了另一个游标以从 Temptable 中获取“名称”

CREATE PROC [dbo].[usp_InsertGenerator]
AS
BEGIN
    DECLARE @tablename varchar(100)
    CREATE TABLE #TempTable(Name varchar(max))
    INSERT INTO #TempTable ( Name) 
        SELECT name from sys.tables 

    -- SET @tablename=(SELECT name from #TempTable )

    DECLARE Cur_Temp CURSOR FOR SELECT name FROM #TempTable
    OPEN Cur_Temp
    FETCH NEXT FROM Cur_Temp INTO @tableName
    WHILE @@FETCH_STATUS=0
    BEGIN
        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
    FETCH NEXT FROM Cur_Temp INTO @tableName
    END
    CLOSE Cur_Temp
    DEALLOCATE Cur_Temp
END

【讨论】:

    猜你喜欢
    • 2013-04-10
    • 2011-11-02
    • 2011-07-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多