检索服务器和数据库的名称有什么办法来检索从存储过程
- 服务器的计算机名
- 数据库的名称
从存储过程中的SQL Server?
我想要做的是以下几点:
- 运行存储过程作为用户X
- 从存储过程中,使用
OPENDATASOURCE
检索只能作为用户Y被检索的数据不幸的是,Y不能被硬编码,因为它是一个参数。
数据库,就是要部署到几个客户,和他们重复多次,因为他们想,等。为此,我CAN NOT硬编码数据库服务器的名称或数据库的名称。
(我知道这气味像不好的设计,没有什么我可以做的。)为DB名称
检索服务器和数据库的名称有什么办法来检索从存储过程
从存储过程中的SQL Server?
我想要做的是以下几点:
OPENDATASOURCE
检索只能作为用户Y被检索的数据不幸的是,Y不能被硬编码,因为它是一个参数。数据库,就是要部署到几个客户,和他们重复多次,因为他们想,等。为此,我CAN NOT硬编码数据库服务器的名称或数据库的名称。
(我知道这气味像不好的设计,没有什么我可以做的。)为DB名称
使用SELECT db_name();
和SELECT @@SERVERNAME;
服务器名
我不知道你的目标是什么,但有一些可能会满足您的需要内部函数:
select DB_NAME(), @@SERVERNAME
如果您选择了,或者根据需要在常规查询中使用它们,您可以将这些包装在带有out参数的过程中。
需要注意的一件事是@@ SERVERNAME是服务器的名称,不一定是服务器托管的物理计算机名称的名称。当您在单台机器上托管多个实例或开始将应用程序移入SqlAzure时,这变得更加重要。
计算机名称可以从SERVERPROPERTY(财产)功能
create function getComputerName() return varchar(128) begin return select serverproperty('ServerName') end
现有DB_NAME()函数返回数据库名
create function getDatabaseName() return varchar(128) begin return db_name() end
其实,我觉得有一个更好的解决方案来检索为你。为什么不利用SqlServer的“EXECUTE AS”子句:
而不是找出服务器和数据库名称,用新用户打开与该数据库的新连接,然后查询,只是关闭连接并恢复到原始调用。CREATE USER me WITHOUT LOGIN
GO
CREATE PROCEDURE foo
@UserToQueryAs SYSNAME
AS
BEGIN
-- Do stuff as calling user
EXECUTE AS USER = @UserToQueryAs;
-- Do stuff as @UserToQueryAs
SELECT USER_NAME();
REVERT;
-- Do more stuff as calling user
END
GO
exec foo 'me'
上面的例子的结果:me
这里其他一些方法:SELECT SERVERPROPERTY( '计算机名');和SELECT SERVERPROPERTY('ServerName'); – 2011-03-29 22:36:14
@K Ivanov,谢谢! – pyon 2011-03-29 22:37:44