我正在编写一个存储过程,它将比较两个不同数据库下的两个相似表。我在这里使用关键字 USE [dbname] 。
DECLARE
--INPUT
@BASE_DATABASE_NAME NVARCHAR(50),
@TARGET_DATABASE_NAME NVARCHAR(50),
@TARGET_PRODUCT_ID NVARCHAR(50),
@TARGET_PRODUCT_CODE NVARCHAR(50)
SET @BASE_DATABASE_NAME='USE [DB1]'
SET @TARGET_DATABASE_NAME='USE [DB2]'
SET @TARGET_PRODUCT_ID=4194
SET @TARGET_PRODUCT_CODE = @BASE_DATABASE_NAME ( SELECT PRODUCT_CODE FROM T_PRODUCT_MST WHERE PROD_ID = @TARGET_PRODUCT_ID)
print @TARGET_PRODUCT_CODE.
错误 -
它不起作用......
有人可以帮我解决这个问题吗?我需要动态地将数据库名称传递给sql查询。
提前致谢..
答案 0 :(得分:2)
您不能以这种方式使用USE
。 USE
设置执行所有语句的数据库,不能在另一个查询中使用。
您可以使用动态SQL来指定查询:
DECLARE
--INPUT
@BASE_DATABASE_NAME NVARCHAR(50),
@TARGET_PRODUCT_ID INT,
@TARGET_PRODUCT_CODE NVARCHAR(50)
SET @BASE_DATABASE_NAME='[DB1]'
SET @TARGET_PRODUCT_ID=1
DECLARE @SQL NVARCHAR(MAX) = N'SELECT @TARGET_PRODUCT_CODE = PRODUCT_CODE FROM '
+ @BASE_DATABASE_NAME
+ N'..T_PRODUCT_MST WHERE PROD_ID = @TARGET_PRODUCT_ID'
exec sp_executesql @SQL, N'@TARGET_PRODUCT_ID INT, @TARGET_PRODUCT_CODE NVARCHAR(50) OUTPUT',
@TARGET_PRODUCT_ID, @TARGET_PRODUCT_CODE OUTPUT
print @TARGET_PRODUCT_CODE
答案 1 :(得分:0)
Szymon的另一个选择是使用同义词。首先在DB中创建您的同义词:
CREATE SYNONYM [dbo].[TargetProductCode] FOR [DB2].[dbo].[T_Product_MST]
然后您的sql语法变为:
SET @TARGET_PRODUCT_CODE = SELECT PRODUCT_CODE
FROM dbo.TargetProductCod WHERE PROD_ID = @TARGET_PRODUCT_ID
如果这不需要是动态的,这可以是一个很好的解决方案,并且还可以使测试更容易,如果由于某种原因你需要将测试数据库指向另一个目标(可以只更新同义词)