将带引号的字符串传递给存储过程中的函数

时间:2013-01-15 00:18:01

标签: sql sql-server tsql stored-procedures

我有这个功能:

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER FUNCTION [dbo].[SE_VALOR] (@valor int, @verd char(20), @fals char(20))
RETURNS char(20)
AS
BEGIN
DECLARE @resposta char(20)
    ---Check for unit, if meters(MT), convert it to feet(FT)
    IF @valor=1
        BEGIN
            set @resposta = @verd
        END
    ELSE
        BEGIN
            set @resposta =@fals
    END
RETURN( @resposta   )
END

然后我有了这个存储过程:

SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[SP_pn_FichaTecnica_Motor_Web]
@IDVersao int

AS

DECLARE @Comando nvarchar(4000)
DECLARE @DIESEL varchar(10)
DECLARE @GASOLINA varchar(10)

SET @DIESEL = 'Diesel'
SET @GASOLINA = 'Gasolina'

--

set @Comando = 'SELECT somefield1, somefield2, somefield3,
                dbo.SE_VALOR(TblMotor.TipoInjeccao,@DIESEL,@GASOLINA) AS TipoInjeccao
                FROM sometable
                WHERE IDVersao = @IDVersao'

EXEC sp_executesql @Comando, N'@IDVersao int, @DIESEL varchar(10),@GASOLINA varchar(10)',@IDVersao,@DIESEL,@GASOLINA
print(@Comando)

如何在不给我错误的情况下传递变量@DIESEL和@GASOLINA?

如果我尝试执行SP:

exec SP_pn_FichaTecnica_Motor_Web 27828

我明白了:

  

Msg 102,Level 15,State 1,Line 32   

附近的语法不正确

5 个答案:

答案 0 :(得分:1)

我想我遇到了你的问题,你想把常量作为常量传递,而不是作为参数传递。 在这种情况下:

set @Comando = 'SELECT somefield1, somefield2, somefield3,
            dbo.SE_VALOR(TblMotor.TipoInjeccao,''Diesel'',''Gasolina'') AS TipoInjeccao
            FROM sometable
            WHERE IDVersao = @IDVersao'

EXEC sp_executesql @Comando, N'@IDVersao int',@IDVersao

换句话说,你只需要加倍单引号。

答案 1 :(得分:1)

感谢您的帮助。我为@Naomi分配了有用的答案,因为双引号有效。 但真正的问题是var @Comando的大小。 我把它定义为:

DECLARE @Comando nvarchar(4000)

但意识到查询超出了这个值,因此将其更改为:

DECLARE @Comando nvarchar(max)

解决了我的问题。

希望这有助于其他人。 :)

答案 2 :(得分:0)

您获得的确切错误(完整错误)是什么?从第一眼看你的代码是正常的(除了错误地为你自己的存储过程使用sp_前缀 - 这个前缀是为系统存储过程保留的,你应该尝试使用其他任何东西,比如,sp不带_)。

答案 3 :(得分:0)

对于输入参数,您可以直接将它们放在查询中,但您可能希望通过将'替换为''来转义SET @DIESEL = (REPLACE (@DIESEL, '''', '''''')) SET @GASOLINA = (REPLACE (@GASOLINA, '''', '''''')) SET @IDVersao = (REPLACE (@IDVersao, '''', '''''')) set @Comando = 'SELECT @myOutput = dbo.SE_VALOR(TblMotor.TipoInjeccao,'+@DIESEL+','+@GASOLINA+') AS TipoInjeccao FROM sometable WHERE IDVersao = '+@IDVersao+'' EXEC sp_executesql @Comando, N'@myOutput CHAR(20) OUTPUT', @myOutput OUTPUT 字符。

SP的输出应该是输出参数,例如:

{{1}}

答案 4 :(得分:0)

set @Comando = 'SELECT somefield1, somefield2, somefield3,
                dbo.SE_VALOR(TblMotor.TipoInjeccao,@DIESEL,@GASOLINA) AS TipoInjeccao
                FROM sometable
                WHERE IDVersao = @IDVersao'

将其更改为

SET QUOTED_IDENTIFIER OFF
set @Comando = "SELECT somefield1, somefield2, somefield3,
                dbo.SE_VALOR(TblMotor.TipoInjeccao,@DIESEL,@GASOLINA) AS TipoInjeccao
                FROM sometable
                WHERE IDVersao = @IDVersao"
SET QUOTED_IDENTIFIER ON