SQLServer:XML值返回标量,似乎需要将其转换两次

SQLServer:XML值返回标量,似乎需要将其转换两次,sql,sql-server,xml,tsql,stored-procedures,Sql,Sql Server,Xml,Tsql,Stored Procedures,我有一行SQL: DECLARE @temp_Id UNIQUEIDENTIFIER = @data.value('/metaData[1]/item[@key="Id"][1]/@value', 'uniqueidentifier') 因此,@data是我的存储过程的一个参数@数据XML 我想将一个值从XML传递到另一个存储过程中,正如您可以看到的那样,它是XML中的Id字段 @data.value('/metaData[1]/item[@key="Id"][1]/@value', 'uni

我有一行SQL:

DECLARE @temp_Id UNIQUEIDENTIFIER = @data.value('/metaData[1]/item[@key="Id"][1]/@value', 'uniqueidentifier')
因此,
@data
是我的存储过程的一个参数<代码>@数据XML

我想将一个值从XML传递到另一个存储过程中,正如您可以看到的那样,它是XML中的
Id
字段

@data.value('/metaData[1]/item[@key="Id"][1]/@value', 'uniqueidentifier')
这将拉出
Id
值并将其转换为
Uniqueidentifier
,但是当我将其分配给变量并将其传递给存储过程时:

EXEC my_sproc @Id = @temp_Id
我犯了一个错误

Msg 137,15级,状态2,程序存储过程,第行__ 必须声明标量变量“@tempId”

环顾四周,人们建议将
@data.value(…
包装成
转换(数据类型,值)
,这似乎有点荒谬

--编辑--

CREATE PROCEDURE [dbo].[Sproc_CB8PutNotification]
    @message_type NVARCHAR(250),
    @utc_timestamp DATETIME2,
    @data XML
AS
BEGIN TRY
    DECLARE @temp_Id UNIQUEIDENTIFIER = @data.value('/metaData[1]/item[@key="Id"][1]/@value', 'uniqueidentifier')

    EXEC dbo.SaveNotification @Id = @tempId;
END TRY
BEGIN CATCH
   -- some catch code
END CATCH
我估计我的SQL Server Management Studio intellisense也有可能不同步

--代码--

CREATE PROCEDURE [dbo].[Sproc_CB8PutNotification]
    @message_type NVARCHAR(250),
    @utc_timestamp DATETIME2,
    @data XML
AS
BEGIN TRY
    DECLARE @temp_Id UNIQUEIDENTIFIER = @data.value('/metaData[1]/item[@key="Id"][1]/@value', 'uniqueidentifier')

    EXEC dbo.SaveNotification @Id = @tempId;
END TRY
BEGIN CATCH
   -- some catch code
END CATCH
它应该在以下方面发挥作用:

CREATE PROCEDURE my_proc
   @id  UNIQUEIDENTIFIER
AS
SELECT @id;
GO

DECLARE @data XML = 
  '<metaData><item key="Id" value="903e9859-f8fd-4163-9303-b43f89fe977f"/>
   </metaData>';

DECLARE @temp_Id UNIQUEIDENTIFIER 
       = @data.value('/metaData[1]/item[@key="Id"][1]/@value', 'uniqueidentifier');

EXEC my_proc @id = @temp_id;
错误、警告: 必须声明标量变量“@temp\u id”

或者您有嵌套调用,并且变量超出范围

编辑:

打字错误
@temp\u id
@tempId

DECLARE @temp_Id UNIQUEIDENTIFIER = 
       @data.value('/metaData[1]/item[@key="Id"][1]/@value', 'uniqueidentifier')

EXEC dbo.SaveNotification @Id = @tempId;


您混合了两种命名约定。关键是要保持一致。这样可以省去很多麻烦。

正如您所看到的,先声明,然后执行存储过程call@CallumLinington我只看到一些代码行。请提供完整的SP主体的整个脚本以及如何调用它。您可以像我一样制作演示。您的演示就是我所得到的。@Callumlington IT群组解决方案:
您是否尝试过将其关闭并再次打开?
@Callumlington仔细检查变量名称:)