Sql server SQL Server,在存储过程中使用函数

Sql server SQL Server,在存储过程中使用函数,sql-server,stored-procedures,Sql Server,Stored Procedures,我想连接SQL server中两个独立数据库中的两个不同表,我可以通过手动添加数据库名称来实现,但我想从另一个表中获取表名称。这就是我所做的 我创建了一个函数,它返回数据库名称。就是这样 ALTER FUNCTION [dbo].[GetDatabaseName] (@name Nvarchar(50)) RETURNS Varchar(Max) AS BEGIN DECLARE @Database_name Varchar(Max) SET @Database_n

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

我创建了一个
函数
,它返回数据库名称。就是这样

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,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
没有问题,但是当我尝试将它添加到存储过程时,它会给我这个错误。有人能帮我解决这个问题吗


谢谢

正如Mitch建议的那样,在这种情况下必须使用动态sql。因为您的SP动态地包含变量cauculation和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

正如Mitch所建议的,在这种情况下必须使用动态sql。因为您的SP动态地包含变量cauculation和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

您需要使用动态TSQL@MitchWheat你能再解释一下吗?为此,您需要使用动态sql。@ZoharPeled谢谢。.我找到了您需要使用动态sql的解决方案TSQL@MitchWheat你能再解释一下吗?您需要使用动态sql来实现这一点。@ZoharPeled谢谢..我找到了解决方案谢谢..这正是我需要的谢谢..这正是我需要的