Sql server 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
函数
,它返回数据库名称。就是这样
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谢谢..我找到了解决方案谢谢..这正是我需要的谢谢..这正是我需要的