SELECT INTO a table variable in T-SQL
有一个复杂的SELECT查询,我想从中将所有行插入表变量,但是T-SQL不允许它。
Along the same lines, you cannot use a table variable with SELECT INTO or INSERT EXEC queries.
http://odetocode.com/Articles/365.aspx
简短的例子:
1 2 3 4 5 6 7 8 9 10 | 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 |
表变量中的数据稍后将用于将其插入/更新回不同的表(大多数是具有次要更新的相同数据的副本)。 这样做的目的是简单地使脚本比直接在右表中执行
性能不是问题,因为
......或者告诉我,如果我做错了。
尝试这样的事情:
1 2 3 4 5 6 7 8 9 | DECLARE @userData TABLE( name varchar(30) NOT NULL, oldlocation varchar(30) NOT NULL ); INSERT INTO @userData (name, oldlocation) SELECT name, location FROM myTable INNER JOIN otherTable ON ... WHERE age > 30; |
To create a new table from values in another table
但是你已经有了目标表!所以你想要的是
The
INSERT statement adds one or more new rows to a tableYou can specify the data values in the
following ways:...
By using a
SELECT subquery to specify
the data values for one or more rows,
such as:
1
2
3
4 INSERT INTO MyTable
(PriKey, Description)
SELECT ForeignKey, Description
FROM SomeView
在这种语法中,允许
您还可以使用公用表表达式来存储临时数据集。它们更优雅,更友好:
1 2 3 4 5 6 7 8 9 10 | 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 |
您可以尝试使用临时表...如果您不是从应用程序执行此操作。 (手动运行可能没问题)
1 2 3 | SELECT name, location INTO #userData FROM myTable INNER JOIN otherTable ON ... WHERE age>30 |
你跳过努力以这种方式宣布表格......
帮助进行特殊查询...这会创建一个本地临时表,除非您在同一个会话中,否则这些临时表对其他会话不可见。如果您从应用程序运行查询,可能会出现问题。
如果您要求它在应用程序上运行,请使用以这种方式声明的变量:
1 2 3 4 5 6 7 8 9 | 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; |
编辑:很多人都提到了来自连接的会话的更新可见性。创建临时表不是Web应用程序的选项,因为会话可以重用,在这些情况下坚持使用临时变量
尝试使用
1 2 | INSERT @UserData SELECT name, location etc. |
首先创建一个临时表:
步骤1:
1 2 3 4 5 6 | create table #tblOm_Temp ( Name varchar(100), Age Int , RollNumber bigint ) |
**步骤2:**在Temp表中插入一些值。
1 | insert into #tblom_temp values('Om Pandey',102,1347) |
步骤3:声明表变量以保存临时表数据。
1 2 3 4 5 6 | declare @tblOm_Variable table( Name Varchar(100), Age int, RollNumber bigint ) |
第4步:从临时表中选择值并插入表变量。
1 | insert into @tblOm_Variable select * from #tblom_temp |
最后,将值从临时表插入到Table变量中
第5步:可以检查表变量中的插入值。
1 | 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 INTO的一个原因是它允许您使用IDENTITY:
1 2 3 | SELECT IDENTITY(INT,1,1) AS Id, name INTO #MyTable FROM (SELECT name FROM AnotherTable) AS t |
这不适用于表变量,这太糟糕了......