我有这个功能:
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
附近的语法不正确
答案 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