SQl服务器 - 使用'USE [db name]'编写存储过程

时间:2014-02-04 09:11:32

标签: sql sql-server stored-procedures

我正在编写一个存储过程,它将比较两个不同数据库下的两个相似表。我在这里使用关键字 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查询。

提前致谢..

2 个答案:

答案 0 :(得分:2)

您不能以这种方式使用USEUSE设置执行所有语句的数据库,不能在另一个查询中使用。

您可以使用动态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

如果这不需要是动态的,这可以是一个很好的解决方案,并且还可以使测试更容易,如果由于某种原因你需要将测试数据库指向另一个目标(可以只更新同义词)