从存储过程中检索服务器名称和数据库名称

时间:2011-03-29 22:28:18

标签: sql-server stored-procedures

有没有办法检索

  1. 服务器的计算机名称
  2. 数据库名称
  3. 来自SQL Server存储过程?


    我想做的是以下内容:

    1. 以用户X
    2. 运行存储过程
    3. 从存储过程中,使用OPENDATASOURCE检索只能作为用户Y检索的数据。不幸的是,Y不能被硬编码,因为它是一个参数。
    4. 数据库应该部署到多个客户,并由他们复制多次,等等。因此,我 CAN NOT HARDCODE 数据库服务器的名称或数据库的名称

      (我知道这有点像糟糕的设计。我无能为力。)

5 个答案:

答案 0 :(得分:7)

  1. SELECT SERVERPROPERTY('MachineName')
  2. SELECT DB_NAME()

答案 1 :(得分:1)

使用SELECT db_name();作为数据库名称,使用SELECT @@SERVERNAME;作为服务器名称

答案 2 :(得分:1)

我不确定你的目标是什么,但有一些内在因素可能符合你的需要:

select DB_NAME(), @@SERVERNAME

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

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

答案 3 :(得分: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

答案 4 :(得分:1)

我实际上认为有更好的解决方案。而不是查找服务器和数据库名称,使用新用户打开与该数据库的新连接,然后查询,只是为了关闭连接并恢复到原始调用,为什么不利用SqlServer的“EXECUTE AS”子句:< / p>

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