2012-09-22 56 views
3

有沒有辦法通過一個TSQL功能的數據庫名稱,以便它可以在數據庫傳遞一個TSQL函數的數據庫名稱

ALTER function [dbo].[getemailjcp] 
(
@DB_Name varchar(100) 
) 
Returns varchar(4000) 
AS 
BEGIN 
DECLARE @out varchar (4000); 
DECLARE @in varchar (1000); 
Set @out = 
(select substring 
((select ';' + e.email from 
(SELECT DISTINCT ISNULL(U.nvarchar4, 'NA') as email 
FROM [@DB_Name].dbo.Lists ... 
+0

你能證明你的整體功能,而不是'...'? –

+0

請問您的最終目標是什麼,換句話說,您正試圖解決什麼問題?我不禁想知道是否有更優雅的方法在等待。 –

+0

對於大約200個左右的數據庫,我需要檢索到不同的信息片段。我們的代碼工作時間太長了。我試圖用一個函數替換遊標,但再次查看了需求,並意識到我可以在兩個foreachdb的頂層過程中執行我想要的操作,然後完成所有操作。謝謝。 – o365spo

回答

1

執行選擇爲了創建動態SQL語句,你應該存儲過程。例如:

DECLARE @DynamicSQLStatement NVARCHAR(MAX) 
DECLARE @ParmDefinition NVARCHAR(500) 
DECLARE @FirstID BIGINT 

SET @ParmDefinition = N'@FirstID BIGINT OUTPUT' 
SET @DynamicSQLStatement=N' SELECT @FirstID=MAX(ID) FROM ['[email protected]+'].[dbo].[SourceTable]' 


EXECUTE sp_executesql @DynamicSQLStatement,@ParmDefinition,@[email protected] OUTPUT 

SELECT @FirstID 

在這個例子中:

  1. @DatabaseName被傳遞作爲參數傳遞給你的程序。

  2. @FirstID是輸出參數 - 此值可能會從您的過程中返回。

在這裏您可以找到 「sp_executesql的」 詳細信息:

http://msdn.microsoft.com/en-us/library/ms188001.aspx

+0

但是你不能在一個函數*中做這個*。我會假設OP試圖將它移動到一個函數,以便他們可以稱它爲查詢的每一行... –

+0

@AaronBertrand你說得對,「sp_executesql」可以在函數中執行,用戶存儲過程是必需的。 – gotqn

0

一個更好的解決方案可能是更換 「@DatabaseName」(一個字符變量):

「 DB_NAME(< @DBId>)「。

然後,您可以繼續傳遞數據庫名稱,但是首先將它們轉換爲fcn中的ID。如果使用「sp_executesql」來幫助防範SQL注入(「DB_NAME()」不是變量/不能被替換),還可以解決構建其中包含char變量的SQL語句的矛盾。

所以你有這樣的:

DECLARE @DynamicSQLStatement NVARCHAR(MAX) 
DECLARE @ParmDefinition NVARCHAR(500) 
DECLARE @FirstID BIGINT 
DECLARE @DBId INT 

SET @DBId = DB_ID(@Db_Name) --raise the proper security/robustness** concern if this doesn't resolve. 

SET @ParmDefinition = N'@FirstID BIGINT OUTPUT' 
SET @DynamicSQLStatement=N' SELECT @FirstID=MAX(ID) FROM ['+DB_NAME(@DBId)+'].[dbo].[SourceTable]' 
相關問題