【问题标题】:How to set an SQL variable from a query against DatabaseA and use the variable in a query against databaseB如何从针对数据库的查询中设置 SQL 变量并在针对数据库的查询中使用该变量
【发布时间】:2022-11-10 06:23:00
【问题描述】:
USE DATABASE_A
GO   
DECLARE @Action_ID AS UNIQUEIDENTIFIER = (SELECT Action_ID FROM Actions WHERE CodeNumber  = 'VCT-XXX-000001');
        
USE DATABASE_B
GO
DECLARE @Property_ID AS INT  = (SELECT Property_ID FROM [Properties] WHERE Action_ID  = Action_ID);

以上是声明和设置变量@Action_ID 使用从表中选择的查询“行动"在数据库中数据库_A

我想在将针对数据库执行的查询中使用@Action_ID数据库_B但这会引发一个错误,上面写着

“必须声明标量变量“@Action_ID”。

如何在将对数据库执行的查询中使用变量 @Action_ID数据库_B

【问题讨论】:

  • 一个变量只存在于它是在其中声明的。由于您的后一个查询在不同的批次中,因此 @Action_ID 不再存在。要么不使用单独的批处理,要么(可能更好)不更改数据库上下文并为一个查询使用 3 部分命名,为另一个查询使用 2 部分(您在两者中都缺少架构)。
  • 您是否打算随后重新使用 @Action_ID 变量?如果不只是在具有完全限定名称的第二个查询中直接使用来自变量分配的子查询。

标签: sql-server tsql


【解决方案1】:

另一种方法(对于必须或更喜欢使用多个批处理的情况)可能是使用 SESSION_CONTEXT (用于 sqlserver 2016 及更高版本)。

简化示例:

-- in batch 1.
declare @id uniqueidentifier = 'D256B043-FD10-4F96-BC28-FD4C473D45C2'

-- save @id to session_context
EXEC sp_set_session_context @key='id', @value = @id
GO
-- in another batch.
-- restore @id from session_context
declare @id uniqueidentifier = cast(SESSION_CONTEXT(N'id') as uniqueidentifier)

select @id as id -- should show: D256B043-FD10-4F96-BC28-FD4C473D45C2

【讨论】:

    【解决方案2】:

    你不能用“GO”来做到这一点。 (“块分隔符”又名“批处理分隔符”)。

    看:

    What is the use of GO in SQL Server Management Studio & Transact SQL?

    您可以尝试完全限定名称:

    DECLARE @Action_ID AS UNIQUEIDENTIFIER = (SELECT Action_ID FROM DATABASE_A.dbo.Actions WHERE CodeNumber  = 'VCT-XXX-000001');
            
    
    DECLARE @Property_ID AS INT  = (SELECT Property_ID FROM DATABASE_B.dbo.[Properties] WHERE Action_ID  = Action_ID);
    

    注意 dbname 和 SCHEMA,然后是表名。

    看:

    https://www.tektutorialshub.com/sql-server/fully-qualified-table-names-in-sql-server/

    SQL Server 中的完全限定表名由三部分组成。 数据库名称、模式名称和实际表名称。

    并且现在配备了“magic name/phrase”(sql+server+fully+qualified+table+name),可以上网搜索

    https://www.google.com/search?q=sql+server+fully+qualified+table+name

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 2021-01-28
      • 2019-04-22
      相关资源
      最近更新 更多