2016-05-16 64 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

谢谢..这正是我需要的 –