檢索服務器和數據庫的名稱有什麼辦法來檢索從存儲過程
- 服務器的計算機名
- 數據庫的名稱
從存儲過程中的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