如何从 #temp 表生成插入数据脚本?

10
在数据库中,我有带有数据的#temp表,需要生成所有数据的插入脚本。
如何完成?我右键单击了tempDB,选择>任务>生成脚本,但无法选择#temp表来生成脚本(不能选择)。
我该如何从#temp表生成插入脚本?我使用的是SQL Server 2008 R2。

2
你能使用SELECT * INTO将其转移到一个新表中,然后生成一个脚本吗? - ughai
@ughai,您的意思是创建一个物理表格吗? - user576510
是的 - ughai
这将非常耗费时间,我将不得不手动创建许多表格。有更好的方法吗? - user576510
你不需要手动创建任何表格。你只需要为每个 #temp 表格编写一个单独的 SELECT 语句,就像这样 SELECT * INTO Tbl1 FROM #temp1。表格会自动创建。请查阅相关资料。 - ughai
4个回答

4
您可以将查询结果插入SQL表格(临时表格,它将被自动创建):
SELECT * INTO myTempTable FROM (query results) 

例如:SELECT * INTO myTempTable FROM user where condition

将在 dbo 模式下创建名为 myTempTable 的表。然后点击数据库,选择:

任务 > 生成脚本

选择表myTempTable


3
小建议:不要将#用作表名的前缀。如果使用“生成脚本”时,您将无法找到该表。(注:此翻译为更加通俗易懂的表达方式,但保留了原文的意思和语法结构。) - Natrium

0

您可以使用以下查询批处理程序为临时表生成脚本,并根据条件选择行。我从这里获取了这个批处理程序。在原始来源中,作者创建了用于生成脚本的存储过程。我已经格式化和修改以声明带有条件的TableName。您需要在tempdb中运行此查询批处理程序,并使用您的#temp table name。感谢Neeraj Prasad Sharma

DECLARE @QUERY VARCHAR(MAX) = 'Dbo.#Temp where 1 = 1'

SET NOCOUNT ON

DECLARE @WithStrINdex AS INT
DECLARE @WhereStrINdex AS INT
DECLARE @INDExtouse AS INT

DECLARE @SchemaAndTAble VARCHAR(270)
DECLARE @Schema_name VARCHAR(30)
DECLARE @Table_name VARCHAR(240)
DECLARE @Condition VARCHAR(MAX) 

SELECT @WithStrINdex = 0
SELECT @WithStrINdex = CHARINDEX('WITH', @Query), @WhereStrINdex = CHARINDEX('WHERE', @Query)

IF(@WithStrINdex != 0)
    SELECT @INDExtouse = @WithStrINdex
ELSE
    SELECT @INDExtouse = @WhereStrINdex

SELECT @SchemaAndTAble  =  LEFT(@Query, @INDExtouse - 1) 
SELECT @SchemaAndTAble = LTRIM(RTRIM(@SchemaAndTAble))

SELECT @Schema_name = LEFT(@SchemaAndTAble, CHARINDEX('.', @SchemaAndTAble ) - 1)
,@Table_name  =  SUBSTRING(@SchemaAndTAble, CHARINDEX('.', @SchemaAndTAble ) + 1, LEN(@SchemaAndTAble))
,@CONDITION = SUBSTRING(@Query, @WhereStrINdex + 6, LEN(@Query))--27+6


DECLARE @COLUMNS TABLE([Row_number] SMALLINT, Column_Name VARCHAR(MAX))
DECLARE @CONDITIONS AS VARCHAR(MAX)
DECLARE @Total_Rows AS SMALLINT
DECLARE @Counter AS SMALLINT

DECLARE @ComaCol AS VARCHAR(MAX)
SELECT @ComaCol = '', @Counter = 1, @CONDITIONS = '' 

print @Schema_name
print @Table_name

INSERT INTO @COLUMNS
SELECT ROW_NUMBER() OVER(ORDER BY ORDINAL_POSITION) [Count] ,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @Schema_name
AND TABLE_NAME = @Table_name 
AND COLUMN_NAME NOT IN ('SYNCDESTINATION','PENDINGSYNCDESTINATION' ,'SKUID','SALECREDITEDTO')

SELECT @Total_Rows = COUNT(*) FROM @COLUMNS
SELECT @Table_name = '['+@Table_name+']'
SELECT @Schema_name = '['+@Schema_name+']'

WHILE (@Counter< = @Total_Rows )
BEGIN 
    SELECT @ComaCol =  @ComaCol + ' ['+Column_Name+'],' FROM @COLUMNS
    Where [Row_number] = @Counter

    SELECT @CONDITIONS = @CONDITIONS+ ' + CASE WHEN ['+Column_Name+'] IS NULL THEN ''NULL'' ELSE '''''''' + 
                    REPLACE( CONVERT(VARCHAR(MAX),['+Column_Name+']) ,'''''''','''')
                    +'''''''' END +'+''','''
                    FROM @COLUMNS WHERE [Row_number] = @Counter

        SET @Counter = @Counter + 1
END

SELECT @CONDITIONS = RIGHT(@CONDITIONS, LEN(@CONDITIONS) -2)

SELECT @CONDITIONS = LEFT(@CONDITIONS, LEN(@CONDITIONS) -4)

SELECT @ComaCol =  SUBSTRING (@ComaCol, 0, LEN(@ComaCol))

SELECT @CONDITIONS =  '''INSERT INTO ' + @Schema_name + '.' + @Table_name + '(' + @ComaCol + ')' +' VALUES( '+'''' + '+' + @CONDITIONS
SELECT @CONDITIONS = @CONDITIONS + '+' + ''')'''

SELECT @CONDITIONS =  'SELECT' + @CONDITIONS + 'FROM' + @Schema_name + '.' + @Table_name + ' WITH(NOLOCK) ' + ' WHERE ' + @Condition
PRINT(@CONDITIONS)
EXEC(@CONDITIONS)

0

另一种更快但更长的方法是:

使用SqlPubWiz

只需前往:

C:\Program Files (x86)\Microsoft SQL Server\90\Tools\Publishing\1.4

运行并填写有关登录到数据库的必要信息,选择您的数据库并获取整个数据库脚本,然后在保存的脚本文件中查找所需表的插入脚本。


-1

您需要右键单击数据库,然后点击

Tasks -> Generate Scripts

现在你有一个弹出屏幕,请点击下一步

Select specific database objects

现在从“表”选项中选择您的表,然后单击“下一步”,现在您有一个高级按钮,请单击它。

您将有另一个小弹出屏幕可用,选择要脚本化的数据类型并选择。

Data only

点击“确定”,不要忘记将路径作为文件名,仔细保存您的脚本。

现在点击“下一步”,再次点击“下一步”,您的脚本已准备好使用数据了。


1
我正在做同样的事情,但是在点击特定的“数据库对象”时,我没有看到我的临时表。你是说我会在点击这个选项后看到我的#temp表吗? - user576510
你也可以通过将临时表的数据复制到新表中并获取新表的脚本来完成此操作。 - Mahavirsinh Padhiyar
你也可以使用SSMS工具包,只需访问http://www.ssmstoolspack.com/Features?f=9并查看它的工作原理! - Mahavirsinh Padhiyar
1
好的,你可以在这里找到解决方案:https://dev59.com/Smcs5IYBdhLWcg3wfD9P - Mahavirsinh Padhiyar
这是针对PostgreSQL的,不适用于SQL Server。 - electrodrel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接