有一个复杂的 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
相当小,并且仅在需要时手动运行。
...或者告诉我我是否做错了。
尝试这样的事情:
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;
SELECT INTO
的目的是(根据文档,我强调)
从另一个表中的值创建新表
但是你已经有了一个目标表!所以你想要的是
INSERT 语句向表中添加一个或多个新行 您可以通过以下方式指定数据值: ... 通过使用 SELECT 子查询为一个或多个行指定数据值,例如: INSERT INTO MyTable (PriKey , 描述) SELECT ForeignKey, Description FROM SomeView
在 this 语法中,允许 MyTable
是一个表变量。
MyTable
这里是 your 实际 table 名称的 placeholder。我认为没有任何真正的数据库具有名为 MyTable
的表 ...
您还可以使用公用表表达式来存储临时数据集。它们更加优雅和临时友好:
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
您跳过以这种方式声明表的工作...有助于临时查询...这将创建一个本地临时表,除非您在同一个会话中,否则其他会话不会看到该表。如果您从应用程序运行查询,可能会出现问题。
如果您需要它在应用程序上运行,请使用以这种方式声明的变量:
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 应用程序的选项,因为会话可以重用,在这些情况下坚持使用临时变量
function
中使用。根据我的经验,在大多数情况下,如果有人认为他们需要这样的语句,这实际上意味着他们应该重新考虑他们的 function
,或者至少重构为 procedure
。至少为我自己说话。 :-)
尝试使用 INSERT
而不是 SELECT INTO
:
DECLARE @UserData TABLE(
name varchar(30) NOT NULL,
oldlocation varchar(30) NOT NULL
)
INSERT @UserData
SELECT name, oldlocation
首先创建一个临时表:
步骤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
好的,现在通过足够的努力,我可以使用以下内容插入@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' ) 作为一个;
这里的主要内容是选择要插入的列。
使用 SELECT INTO 的一个原因是它允许您使用 IDENTITY:
SELECT IDENTITY(INT,1,1) AS Id, name
INTO #MyTable
FROM (SELECT name FROM AnotherTable) AS t
这不适用于表变量,这太糟糕了......
IDENTITY
列声明表变量。