Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用和DB.sp_执行之间的差异_Sql_Sql Server 2008_Tsql - Fatal编程技术网

Sql 使用和DB.sp_执行之间的差异

Sql 使用和DB.sp_执行之间的差异,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我意识到在不同的数据库上运行动态字符串有两种方法: 第一个是: declare @sql nvarchar(max) set @sql = 'select 1' exec MyDatabase.sp_execute @sql 第二个是: declare @sql nvarchar(max) set @sql = 'Use MyDatabase select 1' exec sp_execute @sql 有人能指出这两种方法之间的区别吗?如果其中一个比另一个好,为

我意识到在不同的数据库上运行动态字符串有两种方法:

第一个是:

declare @sql nvarchar(max)
set @sql = 'select 1'
exec MyDatabase.sp_execute @sql 
第二个是:

declare @sql nvarchar(max)
set @sql = 'Use MyDatabase
            select 1'
exec sp_execute @sql 

有人能指出这两种方法之间的区别吗?如果其中一个比另一个好,为什么?

使用
设置当前会话的数据库上下文,而在
exec
语句中,您告诉它只对该语句使用哪个数据库。执行
exec
语句后,会话的数据库上下文将不会更改您运行的内容

所以,在你的例子中,没有函数上的区别。在更一般的意义上,有一个相当大的问题

您也可以这样做:

select * from MyDatabase.dbo.MyTable
这将从上下文之外的另一个数据库中提取数据。您也可以使用它在数据库之间连接数据,就像执行普通连接一样