SQLServer:XML值返回标量,似乎需要将其转换两次
我有一行SQL: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
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仔细检查变量名称:)