使用declare中的所有变量运行存储过程并检索无值

时间:2015-12-10 13:15:05

标签: sql-server tsql

我已经设法编写了我的存储过程,它现在正在运行但没有检索到结果。

CREATE PROCEDURE [dbo].[SigleEnseigne]
AS
    BEGIN

    DECLARE @Sigle VARCHAR(150),
            @Enseigne VARCHAR(150),  
            @SigleEnseigne1 VARCHAR(150)

        SELECT  @Sigle = ISNULL(John_Jack.Sigle, '') ,
                @Enseigne = ISNULL(John_Jack.Enseigne, '') ,
                @SigleEnseigne1 = CASE WHEN Code_Juridique LIKE 'M%'
                                       THEN '      / '
                                            + ISNULL(John_Jack.Enseigne, '')
                                       WHEN ISNULL(John_Jack.Sigle, '') = ''
                                            AND ISNULL(John_Jack.Enseigne, '') = ''
                                       THEN ''
                                       ELSE @Sigle + ' / ' + @Enseigne
                                  END
        FROM    John_Jack

        SELECT @Sigle, @Enseigne, @SigleEnseigne1

    END

然而,当我正在运行SELECT * FROM John_Jack时,我确实有结果。

我做错了什么?

我一直误解了什么吗?

我已经在网上查了一下,但没有任何相关内容突出。

1 个答案:

答案 0 :(得分:2)

您的选择中似乎缺少某些条件:

SELECT  @Sigle = ...
FROM    John_Jack

因此,当它在John_Jack表中的记录多于一个时,您的变量赋值将无法按预期工作:您不能将表中的多个值放入变量。

你要么在where子句中写一些过滤条件,要么(如果你不关心你从表中得到什么值)只需要使用像

这样的东西
SELECT  TOP 1
   @Sigle = ...
FROM    John_Jack

或者,如果您需要根据您的逻辑(正如您在评论中所述)“重新格式化”检索整个表格数据 - 那么只需删除这些变量并重写您的过程

CREATE PROCEDURE [dbo].[SigleEnseigne]
AS
BEGIN
    SELECT  
        ISNULL(John_Jack.Sigle, '') as Sigle,
        ISNULL(John_Jack.Enseigne, '') as Enseigne,
        CASE WHEN Code_Juridique LIKE 'M%'
            THEN '      / '
            + ISNULL(John_Jack.Enseigne, '')
            WHEN ISNULL(John_Jack.Sigle, '') = ''
            AND ISNULL(John_Jack.Enseigne, '') = ''
                    THEN ''
                    ELSE ISNULL(John_Jack.Sigle, '') 
                         + ' / ' + ISNULL(John_Jack.Enseigne, '')
            END as SigleEnseigne1
            FROM    John_Jack
END