SELECT INTO T-SQL中的表variables

有一个复杂的SELECT查询,我想从中插入所有行到表variables,但T-SQL不允许它。

沿着同样的路线,你不能在SELECT INTO或INSERT EXEC查询中使用表variables。 http://odetocode.com/Articles/365.aspx

简短的例子:

declare @userData TABLE( name varchar(30) NOT NULL, oldlocation varchar(30) NOT NULL ) SELECT name, location INTO @userData FROM myTable INNER JOIN otherTable ON ... WHERE age > 30 

表variables中的数据稍后将被用来将其插入/更新回到不同的表中(主要是更新次数相同的数据的副本)。 这样做的目的是简单地使脚本更易读,更容易定制,而不是直接将SELECT INTOinput到正确的表中。 性能不是问题,因为行rowcount相当小,只有在需要时手动运行。
…或者只是告诉我,如果我做错了。

尝试这样的事情:

 DECLARE @userData TABLE( name varchar(30) NOT NULL, oldlocation varchar(30) NOT NULL ); INSERT INTO @userData SELECT name, location FROM myTable INNER JOIN otherTable ON ... WHERE age > 30; 

SELECT INTO的目的是(根据文档,我的重点)

从另一个表中的值创build一个新表

但是你已经有了一个目标表! 所以你想要的是

INSERT语句将一个或多个新行添加到表中

您可以通过以下方式指定数据值:

通过使用SELECT子查询来指定一个或多个行的数据值,例如:

  INSERT INTO MyTable (PriKey, Description) SELECT ForeignKey, Description FROM SomeView 

这个语法中,允许MyTable是一个表variables。

您还可以使用公用表expression式来存储临时数据集。 他们更优雅和友善:

 WITH userData (name, oldlocation) AS ( SELECT name, location FROM myTable INNER JOIN otherTable ON ... WHERE age>30 ) SELECT * FROM userData -- you can also reuse the recordset in subqueries and joins 

你可以尝试使用临时表…

 SELECT name, location INTO #userData FROM myTable INNER JOIN otherTable ON ... WHERE age>30 

您可以跳过这样的方式来声明表格…帮助临时查询…这将创build一个本地临时表,除非您在应用程序中使用相同的连接,否则其他连接将不可见。

如果你需要variables,可以这样声明:

 DECLARE @userData TABLE( name varchar(30) NOT NULL, oldlocation varchar(30) NOT NULL ); INSERT INTO @userData SELECT name, location FROM myTable INNER JOIN otherTable ON ... WHERE age > 30; 

尝试使用INSERT而不是SELECT INTO

 INSERT @UserData SELECT name, location etc. 

首先创build一个临时表:

步骤1:

 create table #tblOm_Temp ( Name varchar(100), Age Int , RollNumber bigint ) 

**步骤2:**在Temp表格中插入一些值。

 insert into #tblom_temp values('Om Pandey',102,1347) 

第3步:声明一个表variables来保存临时表数据。

 declare @tblOm_Variable table( Name Varchar(100), Age int, RollNumber bigint ) 

步骤4:从临时表中select值并插入表variables。

 insert into @tblOm_Variable select * from #tblom_temp 

最后,将值从临时表插入到表variables中

第5步:可以检查表variables中的插入值。

 select * from @tblOm_Variable 

好的,现在我有足够的努力,我可以插入到@table使用下面:

INSERT @TempWithheldTable SELECT
a.SuspendedReason,a.SuspendedNotes,a.SuspendedBy,a.ReasonCode FROM OPENROWSET(BULK'C:\ DataBases \ WithHeld.csv',FORMATFILE = N'C:\ DataBases \ Format.txt',
ERRORFILE = N'C:\ Temp \ MovieLensRatings.txt')AS a;

这里主要的是select要插入的列。

使用SELECT INTO的一个原因是它允许你使用IDENTITY:

 SELECT IDENTITY(INT,1,1) AS Id, name INTO #MyTable FROM (SELECT name FROM AnotherTable) AS t 

这不会与表variables,这是太糟糕了…