2011-03-29 76 views
1

检索服务器和数据库的名称有什么办法来检索从存储过程

  1. 服务器的计算机名
  2. 数据库的名称

从存储过程中的SQL Server?


我想要做的是以下几点:

  1. 运行存储过程作为用户X
  2. 从存储过程中,使用OPENDATASOURCE检索只能作为用户Y被检索的数据不幸的是,Y不能被硬编码,因为它是一个参数。

数据库,就是要部署到几个客户,和他们重复多次,因为他们想,等。为此,我CAN NOT硬编码数据库服务器的名称或数据库的名称。

(我知道这气味像不好的设计,没有什么我可以做的。)为DB名称

回答

5
  1. SELECT SERVERPROPERTY(“计算机名” )
  2. SELECT DB_NAME()
1

使用SELECT db_name();SELECT @@SERVERNAME;服务器名

+0

这里其他一些方法:SELECT SERVERPROPERTY( '计算机名');和SELECT SERVERPROPERTY('ServerName'); – 2011-03-29 22:36:14

+0

@K Ivanov,谢谢! – pyon 2011-03-29 22:37:44

1

我不知道你的目标是什么,但有一些可能会满足您的需要内部函数:

select DB_NAME(), @@SERVERNAME 

如果您选择了,或者根据需要在常规查询中使用它们,您可以将这些包装在带有out参数的过程中。

需要注意的一件事是@@ SERVERNAME是服务器的名称,不一定是服务器托管的物理计算机名称的名称。当您在单台机器上托管多个实例或开始将应用程序移入SqlAzure时,这变得更加重要。

+0

我正在尝试执行以下操作:以用户X的身份运行存储过程,然后从该SP中检索必须访问neas用户Y的表中的数据。因此,我需要使用'OPENDATASOURCE'来打开到相同的数据库,但作为另一个用户。 – pyon 2011-03-29 22:43:47

+0

连接字符串中的“数据源”字段包含什么?服务器的名称或物理计算机的名称? – pyon 2011-03-29 22:45:18

1

计算机名称可以从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 
1

其实,我觉得有一个更好的解决方案来检索为你。为什么不利用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