2011-03-29 127 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