SQL Server,使用存储过程中的函数

时间:2016-05-16 05:23:20

标签: sql-server stored-procedures

我想从SQL服务器中的两个独立数据库加入两个不同的表,我可以通过手动添加数据库名来实现,但我想从另一个表中获取表名。这就是我所做的。

我创建了一个返回数据库名称的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是另一个数据库中的视图名称。

这会抛出错误

  

Msg 102,Level 15,State 1,Procedure 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 个答案:

答案 0 :(得分:3)

正如Mitch建议的那样,在这种情况下你必须使用动态sql。由于您的SP在运行中包含变量cauclation和substitution(@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

在下面给出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/