2016-05-16 30 views
0

我想從SQL Server中的兩個單獨的數據庫中連接兩個不同的表,我可以通過手動添加數據庫名來完成,但我想從另一個表中獲取表名。這就是我所做的。SQL Server,使用存儲過程中的函數

我創建了一個返回數據庫名稱的function。就是這個。

ALTER FUNCTION [dbo].[GetDatabaseName] 
    (@name Nvarchar(50)) 
RETURNS Varchar(Max) 
AS 
BEGIN 
    DECLARE @Database_name Varchar(Max) 

    SET @Database_name= (SELECT value FROM dbo.setting WHERE name = @name) 

    RETURN @Database_name 
END 

它工作正常,並返回sh94這是另一個數據庫的名字,我想創建一個存儲過程返回的連接的結果。

這是它:

CREATE PROCEDURE [dbo].[GParcel_shahrsazi] 
    @SourceDatabase INT 
AS 
BEGIN 
    DECLARE @DbName varchar(MAx) 
    SET NOCOUNT ON; 

    IF @SourceDatabase = 1 
     SET @DbName = CAST(dbo.GetDatabaseName('ShDB') as VARCHAR) 
    ELSE 
     SET @DbName = dbo.GetDatabaseName('NoDB') 
END 

SET @DbName = CAST(dbo.GetDatabaseName('ShDB') as VARCHAR) 

SELECT * 
FROM dbo.Gparcel AS p 
INNER JOIN @DbName.dbo.GISMappingAttributeTable AS att ON p.FK_BlockNo = att.FK_BlockNo 
                 AND p.FK_LandNo = FK_LandNo 

END 
GO 

其中GISMappingAttributeTable是在另一個數據庫的視圖名稱。

這會引發錯誤

消息102,級別15,狀態1,過程GParcel_shahrsazi,第25行
附近有語法錯誤 ''。

在該行

SELECT * 
FROM dbo.Gparcel as p 
INNER JOIN @DbName.dbo.GISMappingAttributeTable as att ON 

我可以輕鬆地運行

SELECT * 
FROM dbo.Gparcel as p 
INNER JOIN sh94.dbo.GISMappingAttributeTable as att ON p.FK_BlockNo =att.FK_BlockNo And p.FK_LandNo=att.FK_LandNo 

沒有問題,但是當我嘗試將其添加到存儲過程中它給我的錯誤。有人可以幫我找出問題嗎?

謝謝

+1

您將需要使用動態TSQL –

+0

@MitchWheat你能解釋更多嗎? –

+1

[你不能在sql server中標識參數。](http://stackoverflow.com/questions/36419576/i-need-to-pass-column-names-using-variable-in-select-statement-in- store-procedures/36419620#36419620)你需要爲此使用動態sql。 –

回答

3

正如米奇建議,你必須使用動態SQL在這種情況下。由於您的SP包含變量cauclation和替換(@DbName)。當您需要動態構建sql語句時使用動態sql。

例如:動態查找CustomerID,ContactName,City。

DECLARE @sqlCommand varchar(1000) 
DECLARE @columnList varchar(75) 
DECLARE @city varchar(75) 
SET @columnList = 'CustomerID, ContactName, City' 
SET @city = '''London''' 
SET @sqlCommand = 'SELECT ' + @columnList + ' FROM customers WHERE City = ' + @city 
EXEC (@sqlCommand) 

欲瞭解更多信息,你可以閱讀和文章下面給出的鏈接。

在你的SP,你需要做如下SQL statment使用動態SQL

select * from dbo.Gparcel as p INNER JOIN @DbName.dbo.GISMappingAttributeTable as att ON p.FK_BlockNo =att.FK_BlockNo And p.FK_LandNo=FK_LandNo 

https://www.mssqltips.com/sqlservertip/1160/execute-dynamic-sql-commands-in-sql-server/

+0

謝謝..這正是我需要的 –