2009-11-18 32 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 
相关问题