413

有一个复杂的 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它相当小,并且仅在需要时手动运行。
...或者只是告诉我我是否做错了。

4

8 回答 8

654

尝试这样的事情:

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;
于 2010-10-01T10:22:02.850 回答
100

的目的SELECT INTO是(根据文档,我强调)

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

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

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

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

...

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

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

这种语法中,它允许作为MyTable表变量。

于 2010-10-01T10:28:52.117 回答
33

您还可以使用公用表表达式来存储临时数据集。它们更加优雅和临时友好:

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
于 2016-02-04T21:38:23.277 回答
16

您可以尝试使用临时表...如果您不是从应用程序中执行此操作。(手动运行可能没问题)

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 应用程序的选项,因为会话可以重用,在这些情况下坚持使用临时变量

于 2010-10-01T10:21:15.003 回答
9

尝试使用INSERT而不是SELECT INTO

   DECLARE @UserData TABLE(
                        name varchar(30) NOT NULL,
                        oldlocation varchar(30) NOT NULL
                       )

    INSERT @UserData   
    SELECT name, oldlocation
于 2010-10-01T10:19:31.157 回答
7

首先创建一个临时表:

步骤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
于 2014-03-20T09:02:49.827 回答
1

好的,现在通过足够的努力,我可以使用以下内容插入@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' ) 作为一个;

这里的主要内容是选择要插入的列。

于 2017-09-22T09:29:53.333 回答
-5

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

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

这不适用于表变量,这太糟糕了......

于 2013-08-23T00:02:43.700 回答