2009-11-18 58 views
2

T-SQL(SQL Server 2005)有沒有辦法將整個記錄分配給記錄變量,然後使用列名稱引用特定值?在不使用T-SQL中的變量的情況下直接引用列值

我的意思,而不是:

select @var1 = col1, 
     @var2 = col2 
from mytable 
where ID = 1; 

,並指他們爲@var1@var2,像

@record = 
select col1, col2 
from mytable 
where ID = 1; 

,並指他們像@record.col1@record.col2

我是t-sql的初學者,所以希望這個問題不是太簡單。

+0

SQL Server沒有的「記錄」的概念 - 這是:-)的SQL Server程序員說(和任何RDBMS真的)是嚴格的行和列 - 你可以選擇列,你可以限制行 - 就是這樣。 –

+0

簡短回答:不,沒有複合變量,除了T-SQL中的表變量和一些回答指出的,表變量是從表中選出來的。 –

+0

@marc_s:Oracle的PL/SQL可以具有記錄類型的變量。 –

回答

0

埋在Transact SQL documentation我碰到這種限制來了變量:

變量只能在表達式中使用,不到位對象名稱或關鍵字。

由於您需要使用對象名來限定列,我不認爲這是允許的。

2

您可以創建一個表變量,並選擇整個結果集到它:

DECLARE @tt TABLE (col1 INT, col2 INT) 

INSERT 
INTO @tt 
SELECT col1, col2 
FROM mytable 
WHERE id = 1 

,但你不能只是比SELECT查詢以及訪問其數據。

純粹的TSQL(它沒有自定義數據類型),你問的東西是不可能的。

+0

我認爲這樣的事情在TSQL這樣的語言中應該很簡單。還有一個MS失望......我不明白爲什麼我必須定義N個變量才能引用一個表的N列。不管怎麼說,還是要謝謝你! – ercan

1

聽起來你是一名程序員......看看linq吧,也許它是你想做的。

+0

「聽起來像你是程序員」是迄今爲止我見過的最好的引用。 – Quassnoi

+0

其實我是:) – ercan

+0

linq在我看來對我來說太過矯枉過正。我會去一個接一個的作業。謝謝你的提示。 – ercan

1

您可以使用臨時表和SELECT ... INTO,以避免在一開始指定的列名:

SELECT Field1, Field2 
INTO #TempTable 
FROM MyTable 
WHERE MyTable.MyID = 1 

當然你還是會參照時需要的FROM #TempTable部分列名稱。

SELECT Field1, Field2 
FROM #TempTable 

,當然還有要記住在最後刪除表:

DROP #TempTable 

的應用程序代碼就是你通常指的是單排在時間的變量。

+0

你說得對:「應用程序代碼是你通常將單一行作爲變量引用的地方。」也許我應該考慮重新設計。 – ercan

1

你可以使用XML,但你不得不玩這個......

DECLARE @MyRecord xml 
DECLARE @Mytable TABLE (col1 int NOT NULL, col2 varchar(30) NOT NULL) 

INSERT @Mytable (col1, col2) VALUES (1, 'bob') 

select @MyRecord = 
    (SELECT * 
    from @Mytable 
    where col1 = 1 
    FOR XML AUTO) 

SELECT @myRecord.value('./@col', 'int') --also @myRecord.value('@col', 'int') 

--gives error 

Msg 2390, Level 16, State 1, Line 12 
XQuery [value()]: Top-level attribute nodes are not supported 
相關問題