SQl server-使用';使用[db名称]';

SQl server-使用';使用[db名称]';,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我正在编写一个存储过程,它将比较两个不同数据库下的两个相似表。这里我使用关键字使用[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

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


提前感谢。

您不能以这种方式使用
使用
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

Szymon回答的另一个选择是使用同义词。首先在数据库中创建同义词:

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

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

您能提供准确的错误消息吗?谢谢Szymon!!这真的帮了我很大的忙!!但在我的存储过程中,我将结果存储到一个变量中,即@TARGET_PRODUCT_CODE,我将在其他查询中使用它,而您的存储过程没有存储结果。请调查一下。。再次感谢!!我测试了该代码,它对我有效。您需要使用
OUTPUT
返回变量的值。