我想从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
没有问题,但是当我尝试将其添加到存储过程时,它会给我错误。有人可以帮我解决问题吗?
谢谢
答案 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/