Ric*_*ner 7 sql-server stored-procedures type-conversion
我有一个接受参数的存储过程;
CREATE PROCEDURE [dbo].[Stored_Proc_Name] (@ParamID NVARCHAR(255) = NULL)
Run Code Online (Sandbox Code Playgroud)
我调用这个存储过程并传入一个唯一标识符,就像这样;
EXEC [Stored_Proc_Name] 'a6ed99c1-29c8-43f4-9e3a-0065e6dc7fc1'
Run Code Online (Sandbox Code Playgroud)
存储过程做一些 XML 处理并返回一个结果集,它相当简单。
对于传递的一些参数,我收到了类型转换错误;
Msg 8114, Level 16, State 5, Procedure Stored_Proc_Name, Line 0
Error converting data type nvarchar to int.
Run Code Online (Sandbox Code Playgroud)
我最初认为这是数据的问题,但如果我在存储过程中声明一个局部变量,像这样,然后使用该局部变量代替参数,问题就会自行解决。使用此参数的唯一地方是WHERE在我的存储过程中的子句内。
CREATE PROCEDURE [dbo].[Stored_Proc_Name] (@ParamID NVARCHAR(255) = NULL)
AS
DECLARE @localID nvarchar(255)
SET @localID = @ParamID
Run Code Online (Sandbox Code Playgroud)
问题已解决,程序运行良好。
关于下一步调查的任何想法或我遗漏的明显内容?
更新:
经过进一步调查,这是一个 XML 属性缺少 [1] 的问题,因此它似乎一直在尝试转换导致错误的多个属性。我目前正在调查它是如何用变量修复的,一旦我有一个合理的答案就会更新。我会将答案标记为已接受,以便有人获得赏金。
我想知道参数/变量情况是否真的只是掩盖了查询中不相关的隐式转换。这是一个延伸,更熟悉 SQL Server 内部结构的人可能能够澄清我在这里是否完全错了,但我怀疑在参数和变量方法之间切换时,您会得到不同的执行计划。计划中的差异可能足够大,其中隐含的varchar?int转换错误只发生在基于连接顺序的参数化方法而不是变量方法中,因为变量没有被正确嗅探,结果使用了完全不同的连接顺序。
为了测试我的理论,OPTION (RECOMPILE)当您将存储过程转换为使用变量时,在查询的末尾抛出一个语句,看看会发生什么。如果错误再次发生,您可能会在查询中遇到不同的隐式转换,该转换仅在特定执行计划中发生,这意味着您看到的错误与输入无关,而是与系统中已有的数据有关,并且你如何在你的语句中加入表格。