奇怪的SQL Server行为

时间:2009-11-26 20:58:34

标签: sql sql-server

以下声明中的行为名称是什么?

Create table dbo.Foo(name varchar(10))

insert dbo.Foo (name)
select 'Weird'
union
select 'SQL'
union
select 'Server'
union
select 'behavior'

declare @title varchar(max)
set @title = ''
select @title = name + ' ' + @title from dbo.Foo

select @title

--returns 'Weird SQL Server behavior'

这也可以用整数来完成。我想知道这种行为的名称,即混合标量和设置操作。

5 个答案:

答案 0 :(得分:2)

字符串连接?

答案 1 :(得分:2)

这到底有什么奇怪的?您选择4行,SQL Server运行:

 @title = name + ' ' + @title

四次,你最终得到了你提到的字符串。

有点幸运,因为订购非常随意。

答案 2 :(得分:1)

  

以下声明中的行为名称是什么?

我会在评估查询的每一行的表达式时称之为副作用

答案 3 :(得分:1)

这是有时用于在SQL中聚合字符串的方法之一,请参阅Concatenating Row Values in Transact-SQL。不推荐,因为它依赖于执行顺序。在一个真实的表上,你可以获得'奇怪的SQL行为',但也可以'行为奇怪的服务器SQL'。问题记录在PRB: Execution Plan and Results of Aggregate Concatenation Queries Depend Upon Expression Location

答案 4 :(得分:0)

没有人提到SELECT @title = name FROM dbo.Foo更容易的方法从表中选择一个值并将其放在SQL BATCH中的变量中。

因此,select @title = name + ' ' + @title from dbo.Foo选择dbo.Foo中每一行的值,并将其添加到@title的末尾。