我想从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
没有问题,但是当我尝试将其添加到存储过程中它给我的错误。有人可以帮我找出问题吗?
谢谢
您将需要使用动态TSQL –
@MitchWheat你能解释更多吗? –
[你不能在sql server中标识参数。](http://stackoverflow.com/questions/36419576/i-need-to-pass-column-names-using-variable-in-select-statement-in- store-procedures/36419620#36419620)你需要为此使用动态sql。 –