使用Insert Into即时创建表

时间:2013-04-22 18:27:27

标签: sql sql-server sql-server-2008

这可能吗?我有一个很大的.sql文件,里面装满了没有数据库架构的Insert Into语句。我可以动态创建表吗?

以下是一个例子:

INSERT INTO [g_fuel_site] ([SiteID], ... ,[EMVEnabled])
  VALUES('Sep 23 2011 3:05:51:000PM', ... ,0)
编辑:没有桌子!脚本假设我做了!

2 个答案:

答案 0 :(得分:1)

亚伦打了我20秒钟。 例如,更改第一个插入:

INSERT INTO [g_fuel_site] ([SiteID],[CurrentOperatingLevelID],[CurrentPriceBookID],  [NumberFuelSaleBuffers],[LinearUnitOfMeasure],[VolumeUnitOfMeasure],[PreAuthAllowed],[StackedSalesAllowed],[MaxLiveDispensers],[AllowedZeroPPUs],[MaxPPU],[MinPPU],[InitialConfigDone],[DispenserOptionModeID],[GenAuthEnabled],[PendingPriceBookID],[AllowPresetWithHandleUp],[UseFixedGradeName],[UseFixedServiceLevelName],[UseFixedGradeProductCodes],[TokenAttendantRcptCtl],[TokenAttendantNtwrkRcptCtl],[TokenAttendantPrpayRcptCtl],[RunAttendantInBufferedMode],[AllowAttendantBalanceQuery],[TokenOrStandardOperation],[TokenPrefix],[EnablePostPayLimit],[PostPayLimit],[EMVEnabled])VALUES('Sep 23 2011  3:05:51:000PM',1,1,2,'CM','L',1,1,12,0,9.9990,0.7500,1,1,1,2,1,0,0,0,0,0,0,0,0,0,'',0,100.0000,0) 

是:

SELECT 
'Sep 23 2011  3:05:51:000PM' [SiteID],
1 [CurrentOperatingLevelID],
1 [CurrentPriceBookID],
2 [NumberFuelSaleBuffers],
'CM' [LinearUnitOfMeasure],
'L' [VolumeUnitOfMeasure],
1 [PreAuthAllowed],
1 [StackedSalesAllowed],
12 [MaxLiveDispensers],
0 [AllowedZeroPPUs],
9.9990 [MaxPPU],
0.7500 [MinPPU],
1 [InitialConfigDone],
1 [DispenserOptionModeID],
1 [GenAuthEnabled],
2 [PendingPriceBookID],
1 [AllowPresetWithHandleUp],
0 [UseFixedGradeName],
0 [UseFixedServiceLevelName],
0 [UseFixedGradeProductCodes],
0 [TokenAttendantRcptCtl],
0 [TokenAttendantNtwrkRcptCtl],
0 [TokenAttendantPrpayRcptCtl],
0 [RunAttendantInBufferedMode],
0 [AllowAttendantBalanceQuery],
0 [TokenOrStandardOperation],
'' [TokenPrefix],
0 [EnablePostPayLimit],
100.0000 [PostPayLimit],
0 [EMVEnabled]
INTO g_fuel_site

此后表将存在。它只是推断列类型,只有在第一个select into包含以后插入的所有列时才会起作用。

答案 1 :(得分:0)

如果您将第一个(并且只有第一个)更改为SELECT INTO,是的。假设第一个INSERT具有正确的可推导数据类型。请注意,它不会为您神奇地创建键,索引,约束,计算列等。

但是,您的示例还包含一个前导DELETE,这使我相信该表已存在。 DELETE删除表中的所有行,它不会删除表。如果该表不存在,那么您的脚本应该(a)在运行删除之前检查它是否存在,以及(b)运行第一个命令SELECT INTO以便它创建它。但是,您可能希望定义数据类型(我也很难相信SiteIDDATETIME)。

IF OBJECT_ID('dbo.g_fuel_site') IS NOT NULL
BEGIN
  DELETE g_fuel_site;
END
ELSE
BEGIN 
  SELECT SiteID = CONVERT(INT, 1), ... 
    INTO dbo.g_fuel_site 
    WHERE 1 = 0; -- creates table but with 0 rows
END

INSERT dbo.g_fuel_site(SiteID, ...) VALUES(...); -- first row
INSERT ...          
INSERT ...