Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql SELECT语句在从存储过程执行时返回不正确的结果,但在单独测试时工作正常_Sql_Sql Server_Select - Fatal编程技术网

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)