有一个复杂的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, Description) SELECT ForeignKey, Description FROM SomeView
而在这个语法,它允许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应用程序的选项,如会话可以重复使用,坚持临时变量的情况下,
尝试使用INSERT
而不是SELECT INTO
:
INSERT @UserData
SELECT name, location etc.
首先创建一个临时表:
步骤1:
create table #tblOm_Temp (
Name varchar(100),
Age Int ,
RollNumber bigint
)
**步骤2:**插入临时表中的某些值。
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
OK,现在有了足够的努力,我能够插入使用下面的@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”,
错误文件= N'C:\ TEMP \ MovieLensRatings.txt”)AS一个;
这里最主要的是选择插入列。
使用SELECT INTO的一个原因是,它允许您使用的身份:
SELECT IDENTITY(INT,1,1) AS Id, name
INTO #MyTable
FROM (SELECT name FROM AnotherTable) AS t
这不是一个表变量,这是太糟糕工作...