有一个复杂的SELECT查询,我想从中将所有行插入表变量,但是T-SQL不允许它。
同样,您不能将表变量与SELECT INTO或INSERT EXEC查询一起使用。 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
表变量中的数据稍后将用于将其插入/更新回不同的表(大多数是具有次要更新的相同数据的副本)。这样做的目的是简单地使脚本比直接在右表中执行SELECT INTO
更易读,更容易定制。
性能不是问题,因为rowcount
相当小,只在需要时手动运行
......或者告诉我,如果我做错了。
答案 0 :(得分:547)
尝试这样的事情:
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;
答案 1 :(得分:90)
SELECT INTO
的目的是(根据文档,我的重点)
从另一个表格中的值创建新表
但你已经拥有目标表了!所以你想要的是
INSERT
语句将一个或多个新行添加到表您可以在中指定数据值 以下方式:
...
使用
SELECT
子查询指定 一行或多行的数据值, 如:INSERT INTO MyTable (PriKey, Description) SELECT ForeignKey, Description FROM SomeView
在这个语法中,允许MyTable
成为表变量。
答案 2 :(得分:24)
您还可以使用公用表表达式来存储临时数据集。它们更优雅,更友好:
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
答案 3 :(得分:15)
您可以尝试使用临时表...如果您不是从应用程序执行此操作。 (手动运行可能没问题)
SELECT name, location INTO #userData FROM myTable
INNER JOIN otherTable ON ...
WHERE age>30
你跳过努力以这种方式宣布表格...... 帮助进行特殊查询...这会创建一个本地临时表,除非您在同一个会话中,否则这些临时表对其他会话不可见。如果您从应用程序运行查询,可能会出现问题。
如果您要求它在应用上运行,请使用以这种方式声明的变量:
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应用程序的选项,因为会话可以重用,在这些情况下坚持使用临时变量
答案 4 :(得分:8)
尝试使用INSERT
代替SELECT INTO
:
INSERT @UserData
SELECT name, location etc.
答案 5 :(得分:5)
首先创建一个临时表:
第1步:
create table #tblOm_Temp (
Name varchar(100),
Age Int ,
RollNumber bigint
)
**步骤2:**在Temp表中插入一些值。
insert into #tblom_temp values('Om Pandey',102,1347)
步骤3:声明一个表变量来保存临时表数据。
declare @tblOm_Variable table(
Name Varchar(100),
Age int,
RollNumber bigint
)
步骤4:从临时表中选择值并插入表变量。
insert into @tblOm_Variable select * from #tblom_temp
最后将值从临时表插入表变量
第5步:可以检查表变量中的插入值。
select * from @tblOm_Variable
答案 6 :(得分:1)
好的,现在有了足够的努力,我可以使用以下内容插入@table:
INSERT @TempWithheldTable SELECT
a.SuspendedReason, a.SuspendedNotes, a.SuspendedBy, a.ReasonCode FROM OPENROWSET(BULK' C:\ DataBases \ WithHeld.csv',FORMATFILE = N'#39; C:\ databases中\ Format.txt&#39 ;,
错误文件= N' C:\ TEMP \ MovieLensRatings.txt' )AS a;
这里主要是选择要插入的列。
答案 7 :(得分:-5)
使用SELECT INTO的一个原因是它允许您使用IDENTITY:
SELECT IDENTITY(INT,1,1) AS Id, name
INTO #MyTable
FROM (SELECT name FROM AnotherTable) AS t
这不适用于表变量,这太糟糕了......