Sql SELECT语句在从存储过程执行时返回不正确的结果,但在单独测试时工作正常
猜猜下面显示的Sql SELECT语句在从存储过程执行时返回不正确的结果,但在单独测试时工作正常,sql,sql-server,select,Sql,Sql Server,Select,猜猜下面显示的SELECT语句可能有什么问题;当从存储过程测试时,它返回null(输入没有问题),但当独立执行时,测试通过 SELECT @JunitSlugs = ISNULL(@JunitSlugs, '') + ',' + JunitSlug + '-' + (SELECT LookupValue FROM Lookup WHERE LookupId = JunitTy
SELECT
语句可能有什么问题;当从存储过程测试时,它返回null(输入没有问题),但当独立执行时,测试通过
SELECT
@JunitSlugs = ISNULL(@JunitSlugs, '') + ',' + JunitSlug + '-' +
(SELECT LookupValue
FROM Lookup
WHERE LookupId = JunitTypeId)
FROM
JunitList
WHERE
JunitId IN (SELECT JunitId
FROM CapsuleJunits
WHERE CapsuleId = @CapsuleId)
我不是SQL专家,但我知道有更好的方法来编写上面的SQL语句。请建议
在完成过程下方
ALTER PROCEDURE [dbo].[usp_CapsuleList_GetReadyToPub] (@xmlDoc XML = NULL)
AS
BEGIN
BEGIN TRY
SET NOCOUNT ON
DECLARE @CapsuleId INT
DECLARE @PublicationIds VARCHAR(128)
DECLARE @JunitSlugs VARCHAR(MAX)
IF @xmlDoc IS NOT NULL
BEGIN
SELECT @CapsuleId = c.value('(CapsuleId)[1]', 'INT')
,@PublicationIds = c.value('(PublicationIds)[1]', 'VARCHAR(128)')
FROM @xmlDoc.nodes('MCapsuleList') AS T(C)
END
BEGIN
SELECT @JunitSlugs = ISNULL(@JunitSlugs, '') + ',' + JunitSlug + '-' + (
SELECT LookupValue
FROM Lookup
WHERE LookupId = JunitTypeId
)
FROM JunitList
WHERE JunitId IN (
SELECT JunitId
FROM CapsuleJunits
WHERE CapsuleId = 211
)
--SELECT @JunitSlugs = ISNULL(@JunitSlugs, '') + ',' + JunitSlug + '-' + (SELECT LookupValue FROM Lookup WHERE LookupId = JunitTypeId) FROM JunitList WHERE JunitId IN ( SELECT JunitId FROM CapsuleJunits WHERE CapsuleId = @CapsuleId)
SELECT @JunitSlugs = ISNULL(@JunitSlugs, '') + ',' + jl.JunitSlug + '-' + lu.LookupValue
FROM JunitList jl
INNER JOIN Lookup lu ON jl.JunitTypeID = lu.LookupID
WHERE jl.JunitId IN (
SELECT JunitId
FROM CapsuleJunits
WHERE CapsuleId = @CapsuleId
)
SELECT (
SELECT CL.[CapsuleId]
,[PublicationIds]
,[CapsuleSlug] AS Slug
,@JunitSlugs AS JunitIds
--,CreatedBy
,[Headline] AS HeadLine
--,[Excerpt]
--,[Correction]
,CL.UpdatedOn AS UpdatedOn
FROM CapsuleList CL
--LEFT JOIN [PublishUrls] PU ON PU.ParentId = CL.CapsuleId
WHERE CL.PublicationIds = @PublicationIds
AND CL.CapsuleStatusId = 53
ORDER BY CL.CapsuleId
FOR XML PATH('CapsuleList')
,TYPE
)
FOR XML PATH('CapsuleLists')
,ROOT('CapsuleListInfoByXml')
END
END TRY
BEGIN CATCH
DECLARE @ReturnedErrorID INT
EXECUTE @ReturnedErrorID = dbo.usp_HandleException
END CATCH
SET NOCOUNT OFF
END
就更改SQL语句而言,您可以这样做(使用多种方法):
在评论中,我们讨论了存储过程之外的
SELECT
将返回值,因此我删除了答案中有关检查NULL
的部分。由于您最近发布了存储过程的外观,我还删除了关于您是否在存储过程中使用输出
参数的部分。存储过程上的问题可能应该是它自己的独立问题,因为它所涉及的不仅仅是原始问题中发布的初始查询。的工作原理与charm类似。非常感谢。我也想知道我的SELECT语句有什么问题。您是否在存储过程中返回了@JunitSlugs
的值?我的意思是,在您提到的两个选项之间,非存储过程执行只是将值分配给@JunitSlugs
,因此您必须打印它,或者选择它来查看它,但它在您的存储过程中是否也这样做?也可能是@capsucleID
为空(或者只是被设置为查询中找不到的内容…aka..jl.JunitID在capsucleJUnits中没有匹配的内容,其中capsucleID=@capsucleID
),因为它未在存储过程中设置。。可能会有很多事情当独立测试时,没有变量@JunitSlugs,而是在没有变量赋值的情况下确认结果,但我想这应该不会有什么区别,当在SQL语句中添加相同的变量赋值时,您认为它工作得很好。嗨@Brien,不管怎样,你的第一个答案帮助解决了问题,感谢你的时间。
SELECT @JunitSlugs = ISNULL(@JunitSlugs, '') + ',' + jl.JunitSlug + '-' + lu.LookupValue
FROM JunitList jl
INNER JOIN Lookup lu ON jl.JunitTypeID = lu.LookupID
WHERE jl.JunitId IN (SELECT JunitId
FROM CapsuleJunits
WHERE CapsuleId = @CapsuleId)