Следующий запрос возвращает два различных результатов в двух экземплярах SQL Server 2008 R2:Различные поведение вложенного запроса на 2 различных SQL Server 2008 R2
create table a(id int)
insert into a(id)
values(1)
insert into a(id)
values(2)
select
id,
(select count(dbo.a.id) from dbo.a where dbo.a.id = "a"."id")
from a
where a.id = 1
Первая машина дает
id
----------- -----------
1 2
Во-вторых машина дает
id
----------- -----------
1 1
Мы знаем, как исправить эту проблему, используя явный псевдоним в подвале чень. Но поскольку мы так много используем конструкции, это было бы огромной работой. Поэтому мы хотели бы понять проблему.
Возможно, есть опция в SQL Server для управления этим поведением?
2013/07/22:
DBCC USEROPTIONS; SELECT @@ VERSION; дает
Set Option Value
----------------------------- ----------------
textsize 2147483647
language Deutsch
dateformat dmy
datefirst 1
lock_timeout -1
quoted_identifier SET
arithabort SET
ansi_null_dflt_on SET
ansi_warnings SET
ansi_padding SET
ansi_nulls SET
concat_null_yields_null SET
isolation level read committed
------------------------------------
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86)
Jun 17 2011 00:57:23
Copyright (c) Microsoft Corporation
Enterprise Edition on Windows NT 6.0 <X86> (Build 6002: Service Pack 2)
и
Set Option Value
----------------------------- ----------------
textsize 2147483647
language Deutsch
dateformat dmy
datefirst 1
lock_timeout -1
quoted_identifier SET
arithabort SET
ansi_null_dflt_on SET
ansi_warnings SET
ansi_padding SET
ansi_nulls SET
concat_null_yields_null SET
isolation level read committed
------------------------------------
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
Apr 2 2010 15:48:46
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 5.2 <X64> (Build 3790: Service Pack 2)
Для первого сервера работу запроса, как мы этого хотим.
2013/07/24
Это, кажется, не зависит от сервера, но в базах данных.
Сервер:
Set Option Value
---------------------------- ----------------------------------------------
textsize 2147483647
language Deutsch
dateformat dmy
datefirst 1
lock_timeout -1
quoted_identifier SET
arithabort SET
ansi_null_dflt_on SET
ansi_warnings SET
ansi_padding SET
ansi_nulls SET
concat_null_yields_null SET
isolation level read committed
(13 Zeile(n) betroffen)
Die DBCC-Ausführung wurde abgeschlossen. Falls DBCC Fehlermeldungen ausgegeben hat, wenden Sie sich an den Systemadministrator.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86)
Jun 17 2011 00:57:23
Copyright (c) Microsoft Corporation
Enterprise Edition on Windows NT 6.0 <X86> (Build 6002: Service Pack 2)
(1 Zeile(n) betroffen)
После запроса:
create table a(id int)
insert into a(id)
values(1)
insert into a(id)
values(2)
select * from a
select
id,
(select count(dbo.a.id) from dbo.a where dbo.a.id = "a"."id")
from a
where a.id = 1
drop table a
SELECT USER_NAME() AS CurrentUser;
SELECT SCHEMA_NAME() AS CurrentSchema;
Первая база данных дает:
id
-----------
1
2
(2 Zeile(n) betroffen)
id
----------- -----------
1 2
(1 Zeile(n) betroffen)
CurrentUser
--------------------------
dbo
(1 Zeile(n) betroffen)
CurrentSchema
--------------------------
dbo
(1 Zeile(n) betroffen)
Вторая база данных дает:
id
-----------
1
2
(2 Zeile(n) betroffen)
id
----------- -----------
1 1
(1 Zeile(n) betroffen)
CurrentUser
-----------------------
dbo
(1 Zeile(n) betroffen)
CurrentSchema
-----------------------
dbo
(1 Zeile(n) betroffen)
Run 'DBCC USEROPTIONS; SELECT @@ VERSION,' на обоих случаях и опубликовать результаты. –
Результаты добавлены ... – user2598804
Это (ссылка) (http://support.microsoft.com/kb/298674/en-us)) является ожидаемым поведением в таких случаях (подзапросы). Попробуйте запустить этот запрос 'SELECT * FROM sys.databases d WHERE d.database_id = DB_ID()' в обеих базах данных и сравнить результаты. Скажите, пожалуйста, если вы что-то найдете. –