得到了一个复杂的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

table变量中的数据稍后将用于将其插入/更新回不同的表中(大部分是相同数据的副本,只是进行了少量更新)。这样做的目的是使脚本比直接在正确的表中执行SELECT INTO更易于阅读和定制。 性能不是问题,因为行计数相当小,只有在需要时才手动运行。 ...或者直接告诉我是不是我做错了


当前回答

试着用INSERT代替SELECT INTO:

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

    INSERT @UserData   
    SELECT name, oldlocation

其他回答

试着用INSERT代替SELECT INTO:

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

    INSERT @UserData   
    SELECT name, oldlocation

您可以尝试使用临时表……如果不是在应用程序中进行。(手动运行也可以)

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

这样就跳过了声明表的工作…… 帮助adhoc查询…这将创建一个本地临时表,除非您在同一个会话中,否则其他会话不会看到该表。如果你在应用程序中运行查询,可能会出现问题。

如果你需要它在应用程序上运行,使用这样声明的变量:

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

试试这样做:

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;

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

插入@TempWithheldTable SELECT a.SuspendedReason, a.SuspendedNotes, a.SuspendedBy, a.ReasonCode FROM OPENROWSET(BULK 'C:\DataBases\ withhold .csv', FORMATFILE = N 'C: \ \ 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

这对表变量不起作用,这太糟糕了……