Sql server 两个不同SQL Server 2008 R2上嵌套查询的不同行为
以下查询在SQL Server 2008 R2的两个实例上返回两个不同的结果:Sql server 两个不同SQL Server 2008 R2上嵌套查询的不同行为,sql-server,sql-server-2008-r2,nested,aliasing,Sql Server,Sql Server 2008 R2,Nested,Aliasing,以下查询在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 -
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
第二台机器给出
id
----------- -----------
1 2
id
----------- -----------
1 1
我们知道如何通过在子查询中使用显式别名来解决此问题。但是因为我们经常使用这样的结构,这将是一项巨大的工作。所以我们想了解这个问题
SQL Server中是否有控制此行为的选项
2013/07/22:
DBCC用户选项;选择@版本;给予
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)
第一个数据库提供:
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)
第二个数据库提供:
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)
最简单的解释可能是那些
a
表有不同的行
否则,我无法重现这个问题。引用没有显式模式的对象的查询(例如,从中选择*)可以在同一服务器上提供不同的结果,如果
1) 该查询由不同的用户执行
2) 用户被映射到不同的模式(例如dbo和dbo2)
3) 在不同的模式中有两个(或更多)具有相同名称的表/对象(例如:dbo.A
和dbo2.A
)
在选择了SQLCMD模式的SSMS中运行此脚本(菜单:Query>SQLCMD模式):
结果:
Connecting to (local)\SQL2008R2 as login_test_1...
CurrentUser
--------------------------------------------------------------------------------------------------------------------------------
user_test_1
CurrentSchema
--------------------------------------------------------------------------------------------------------------------------------
dbo
ID
-----------
1
Disconnecting connection from (local)\SQL2008R2 as login_test_1...
Connecting to (local)\SQL2008R2 as login_test_2...
CurrentUser
--------------------------------------------------------------------------------------------------------------------------------
user_test_2
CurrentSchema
--------------------------------------------------------------------------------------------------------------------------------
dbo2
ID
-----------
1
2
Disconnecting connection from (local)\SQL2008R2 as login_test_2...
在这种情况下,login_test_1(dbo)得到1行,而login_test_2(dbo2)得到2行
清理脚本:
/*
DROP DATABASE Test;
DROP LOGIN login_test_1;
DROP LOGIN login_test_2;
GO
*/
运行dbccuseroptions;选择@版本在两个实例上编写>并发布结果。这()是这种情况下(子查询)的预期行为。尝试在两个数据库上运行此查询SELECT*FROM sys.databases d,其中d.database_id=DB_id()
,并比较结果。如果你发现了什么,请告诉我。也许[这个]会对你有帮助。