存储过程,构建SQL查询会给出不正确的语法

时间:2015-03-23 22:05:14

标签: sql-server tsql

我已获得以下SQL代码

CREATE PROC [dbo].[GetMessages]
(
  @dateFrom DATETIME = null,
  @dateTo DATETIME = null,
  @messageType NVARCHAR(100) = null,
  @freeText NVARCHAR(255) = null,
  @freeTextSearch BIT,
  @maxRecords INT = 500
 )
 AS
 DECLARE @sqlstr NVARCHAR(1000)
 SET @sqlstr = N'SELECT TOP @maxRecords ma.*, mp.* 
          FROM MessageData ma 
          LEFT JOIN MessagePages mp 
          ON ma.id=mp.id 
          WHERE 1=1 '

 IF @dateFrom <> NULL AND @dateTo <> NULL
BEGIN
    @sqlstr = @sqlstr + N' AND ma.created BETWEEN @dateFrom AND @dateTo'
END

IF @messageType <> NULL
BEGIN
    @sqlstr = @sqlstr + N' ma.msgtype = @messageType'
END

IF @freeTextSearch = '1'
BEGIN
    @sqlstr = @sqlstr + N' CONTAINS(msgdata, @freeText)', 100
END

BEGIN
@sqlstr = @sqlstr + N'ORDER BY ma.id DESC'
END

EXEC sp_executesql @sqlstr, N'@dateFrom DATETIME = null,
                       @dateTo DATETIME = null,
                       @messageType NVARCHAR(100) = null,                   
                       @freeText NVARCHAR(255) = null,
                       @freeTextSearch BIT,
                       @maxRecords INT = 500'

但是,在我尝试附加到Query的所有IF语句中,它给出了以下内容:

  

Msg 102,Level 15,State 1,Procedure GetMessageV2,Line 22
  &#39; @ sqlstr&#39;附近的语法不正确。

我尝试过各种各样的事情,但我根本无法解决这个问题。 任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:4)

您必须在所有 SET语句中使用IF,例如:

IF @messageType <> NULL
BEGIN
    SET @sqlstr = @sqlstr + N' ma.msgtype = @messageType'
END

此外,,100之后CONTAINS在语法上不正确。我不确定你想要在那里实现什么。

答案 1 :(得分:2)

我认为错误就在这一行

@sqlstr = @sqlstr + N' CONTAINS(msgdata, @freeText)', 100

您只需删除,100

即可

希望这有帮助