有一個複雜的SELECT查詢,我想從中將全部行插入表變量,可是T-SQL不容許它。 性能
一樣,您不能將表變量與SELECT INTO或INSERT EXEC查詢一塊兒使用。 http://odetocode.com/Articles/365.aspx spa
簡短的例子: code
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
至關小,而且只在須要時手動運行。
......或者告訴我,若是我作錯了。 get
使用SELECT INTO的一個緣由是它容許您使用IDENTITY: io
SELECT IDENTITY(INT,1,1) AS Id, name INTO #MyTable FROM (SELECT name FROM AnotherTable) AS t
這不適用於表變量,這太糟糕了...... table
首先建立一個臨時表: 變量
步驟1: select
create table #tblOm_Temp ( Name varchar(100), Age Int , RollNumber bigint )
**步驟2:**在Temp表中插入一些值。 bug
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
最後,將值從臨時表插入到Table變量中
第5步:能夠檢查表變量中的插入值。
select * from @tblOm_Variable
您還可使用公用表表達式來存儲臨時數據集。 它們更優雅,更友好:
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
嘗試使用INSERT
而不是SELECT INTO
:
INSERT @UserData SELECT name, location etc.
您能夠嘗試使用臨時表...若是您不是從應用程序執行此操做。 (手動運行可能沒問題)
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應用程序的選項,由於會話能夠重用,在這些狀況下堅持使用臨時變量