SQL Server:变量和存储过程问题

时间:2015-12-10 10:23:16

标签: sql-server tsql stored-procedures

我有以下存储过程

CREATE PROCEDURE SigleEnseigne
     @Sigle VARCHAR OUTPUT,
     @Enseigne VARCHAR OUTPUT,
     @SigleEnseigne1 VARCHAR(150) OUTPUT
AS
BEGIN
    SELECT ISNULL(John_Jack.Sigle,'') 
    INTO Sigle 
    FROM John_Jack

    SELECT ISNULL(John_Jack.Enseigne,'') 
    INTO Enseigne 
    FROM John_Jack

    SELECT 
        CASE 
           WHEN Code_Juridique LIKE 'M%' THEN '      / ' + @Enseigne INTO @SigleEnseigne1
           WHEN @Sigle = '' AND @Enseigne = '' THEN '' INTO @SigleEnseigne1
           ELSE @Sigle + ' / ' + @Enseigne INTO @SigleEnseigne1
        END
    FROM John_Jack
END
GO

我在创建sp

时遇到了这个错误代码
  

Msg 156,Niveau 15,État1,ProcédureSigleEnseigne,Ligne 29
  Syntaxe incorrecte vers le motclé'INTO'。

SQL Server不喜欢这一行

WHEN Code_Juridique LIKE 'M%' THEN '      / ' + @Enseigne INTO @SigleEnseigne1

有人能给我一些关于我做错了什么的见解吗?我是SQL Server的新手,我的脚本可能不尊重T-SQL标准。如果是的话,请赐教。

由于

3 个答案:

答案 0 :(得分:1)

应该是这样的 -

SELECT @Sigle = ISNULL(John_Jack.Sigle,'') 
FROM John_Jack;

SELECT @Enseigne = ISNULL(John_Jack.Enseigne,'') 
FROM John_Jack;

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

定义输出变量@SigleEnseigne1 VARCHAR(150) OUTPUT时。

答案 1 :(得分:1)

应该更像是

WHEN something THEN SET @yourVariableField = whatever

如果您要将数据插入表或表变量

,INTO语句就更多了

答案 2 :(得分:1)

这里有几个问题:

1. Give your types a length
2. Incorrect syntax like `INTO @SigleEnseigne1`
3. You can do this in one go

以下是更正的查询:

CREATE PROCEDURE SigleEnseigne
    @Sigle VARCHAR(150) OUTPUT ,
    @Enseigne VARCHAR(150) OUTPUT ,
    @SigleEnseigne1 VARCHAR(150) OUTPUT
AS
    BEGIN

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

但是如果John_Jack表有多行,那么这个查询没有任何意义。在这种情况下,您可能需要在查询中添加一些WHERE子句以获取所需的行。