0

我有这个功能:

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

我得到:

消息 102,级别 15,状态 1,第 32 行附近的语法不正确

4

5 回答 5

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

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

于 2013-01-15T00:56:01.993 回答
1

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

DECLARE @Comando nvarchar(4000)

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

DECLARE @Comando nvarchar(max)

解决了我的问题。

希望这对其他人有所帮助。:)

于 2013-01-15T22:59:08.280 回答
0

您得到的确切错误是什么(完全错误)?乍一看,您的代码是可以的(除了错误地为您自己的存储过程使用 sp_ 前缀 - 这个前缀是为系统存储过程保留的,您应该尝试使用其他任何东西,例如,没有 _ 的 sp)。

于 2013-01-15T00:41:36.467 回答
0

对于输入参数,您可以直接将它们放在查询中,但您可能希望'通过将其替换为来转义字符''

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

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
于 2013-01-15T00:50:43.000 回答
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
于 2013-01-15T05:24:29.020 回答