2013-01-15 46 views
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 [email protected] 
    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号线 附近有语法错误

回答

0

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

+0

更改sp_ usp_所有我的用户存储过程:) – mjpramos

+0

为了简化本文,我缩小了我正在使用的查询,但它是一英里长。 错误总是: 消息102,级别15,状态1,行32在 附近的语法不正确,然后打印查询停止在左侧outter加入 – mjpramos

+0

看起来错误可能是别的 - 现在删除调用该功能,并重新尝试没有它。 – Naomi

0

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

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

SET @DIESEL = (REPLACE (@DIESEL, '''', '''''')) 
SET @GASOLINA = (REPLACE (@GASOLINA, '''', '''''')) 
SET @IDVersao = (REPLACE (@IDVersao, '''', '''''')) 

set @Comando = 'SELECT @myOutput = 
      dbo.SE_VALOR(TblMotor.TipoInjeccao,'[email protected]+','[email protected]+') AS TipoInjeccao 
      FROM sometable 
      WHERE IDVersao = '[email protected]+'' 

EXEC sp_executesql @Comando, N'@myOutput CHAR(20) OUTPUT', @myOutput OUTPUT 
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 

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

+0

Hi @Naomi!试过了。在执行存储过程时,它会返回上述相同的错误。 :( – mjpramos

+0

你可以请发布确切的错误和你尝试过的确切代码吗?我相信上面应该可以正常工作。你确定使用两个单引号而不是一个双引号吗? – Naomi

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 
1

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

DECLARE @Comando nvarchar(4000) 

,但意识到该查询exceding这个值,所以将其更改为:

DECLARE @Comando nvarchar(max) 

解决我的问题。

希望这可以帮助其他人。 :)

+0

好你发现它 – Naomi

相关问题