1

我有一个 SQL 表,其中有一列存储这样的 xml

<AdditionalInfo><RegistrantID>16279</RegistrantID></AdditionalInfo>

我创建了一个这样的存储过程:

CREATE PROC hr_GetJobStatusByRegistrantId

@registrantId VARCHAR
AS  
BEGIN  
SELECT TOP 1 
      [IsSubscribed]
  FROM [Hrge].[dbo].[hr_Jobs]
  where AdditionalInfo LIKE  '%<AdditionalInfo><RegistrantID>%' + @registrantId + '%</RegistrantID></AdditionalInfo>%'

  END

当我运行这个存储过程时,我得到空值:

 exec hr_GetJobStatusByRegistrantId '16279' 

如果我将此参数设为整数,那么我会转换为 int 错误。

请建议我解决这个问题。

4

1 回答 1

0

(只是将评论扩展为答案)


您应该始终指定 char 或 varchar 字段的宽度,因为除非您执行默认设置。文档说:

在数据定义或变量声明语句中未指定 n 时,默认长度为 1。使用 CAST 和 CONVERT 函数时未指定 n 时,默认长度为 30。

这意味着在您的情况下,您实际上已将“16279”的值修剪@registrantIdVARCHAR(1)单个字符(“1”),并且您实际上搜索了

%<AdditionalInfo><RegistrantID>%1%</RegistrantID></AdditionalInfo>%

在数据库中。这实际上返回了它在数据库中找到的第一条记录的 IsSubscribed 标志,该记录在 RegistrantID字段中的任何位置都有“1”。你很幸运值有问题,所以你注意到了。

此外,您在参数周围使用 % 。这意味着当您搜索 RegistrantID123 中的 a 时,您将得到 123、1234、2123、51236 等的结果,然后只取第一个,无论那个是哪个(由数据库决定,因为有无顺序条款)。我猜您需要完全匹配,因此您应该删除它们,然后使用

'%<AdditionalInfo><RegistrantID>' + @registrantId
                                           + '</RegistrantID></AdditionalInfo>%'

此外,它RegistrantId实际上是一个数字,如果程序的接口反映了它会很好,所以它可以定义为

@registrantId int

然后在查询中转换为字符串

'%<AdditionalInfo><RegistrantID>' + cast(@registrantId as varchar(10))
                                           + '</RegistrantID></AdditionalInfo>%'
于 2013-03-06T09:26:45.643 回答