2014-07-17 146 views
0

我正试图编写一个动态的T-SQL查询并运行到错误中。动态TSQL查询

我已经删除了除单个var之外的所有内容,并且在尝试运行查询时仍然收到错误消息。

ALTER PROCEDURE [dbo].[empowermentFetchSubmissions2] 
@category INT=NULL 
AS 
DECLARE @sSQL AS NVARCHAR (3000), 
@Where AS NVARCHAR (1000) = ''; 
BEGIN 
    SET NOCOUNT ON; 
    BEGIN 
     SET @sSQL = 'SELECT A.[submissionID], 
          A.[subEmpID], 
          A.[nomineeEmpID], 
          CONVERT (VARCHAR (10), A.[submissionDate], 101) AS submissionDate, 
          A.[situation], 
          A.[task], 
          A.[action], 
          A.[result], 
          A.[timestamp], 
          A.[statusID], 
          A.[approver], 
          A.[approvalDate], 
          B.[FirstName] + " " + B.[LastName] AS nomineeName, 
          B.[ntid] AS nomineeNTID, 
          B.[qid] AS nomineeQID, 
          C.[FirstName] + " " + C.[LastName] AS submitName, 
          C.[ntid] AS submitNTID, 
          D.[categoryName] 
        FROM  empowermentSubmissions AS A 
          INNER JOIN 
          empTable AS B 
          ON A.[nomineeEmpID] = B.[empID] 
          INNER JOIN 
          empTable AS C 
          ON A.[subEmpID] = C.[empID] 
          INNER JOIN 
          empowermentCategories AS D 
          ON A.[categoryID] = D.[catID]'; 
     IF (@category) IS NOT NULL 
      SET @Where = @Where + ' AND A.[categoryID] = @_category'; 
     IF LEN(@Where) > 0 
      SET @sSQL = @sSQL + 'WHERE ' + RIGHT(@Where, LEN(@Where) - 3); 
     EXECUTE sp_executesql @sSQL, N'@_category', @_category = @category; 
    END 
END 

错误运行,这是当我得到:

附近有语法错误)“。消息4145,等级15,状态1,行28 表示在预计接近'A'的条件下的上下文中指定的非布尔类型。

有什么明显的,我在这里做错了吗?

+0

那些双引号或两个单引号中的nomineeName和submitName字段?他们应该是两个单引号。 –

+0

他们是双引号环绕'SET'的单引号和不喜欢当那些是单一的.. – SBB

+0

我改变了像这样B.' [FirstName] +''''+ B. [LastName] AS nomineeName,''并得到相同的错误 – SBB

回答

0

我已将您的代码修改为我认为可行的点。我发现了3个问题,通过评论你的执行线并在其之前放置一个print @ssql。然后执行存储过程。第一个问题是报价。我将它们改为单引号。接下来是WHERE的新行,它与ON位于同一行。最后的问题是你没有足够的修剪掉WHERE的,它留下的字母D

ALTER PROCEDURE [dbo].[empowermentFetchSubmissions2] 
@category INT=NULL 
AS 
DECLARE @sSQL AS NVARCHAR (3000), 
@Where AS NVARCHAR (1000) = ''; 
BEGIN 
    SET NOCOUNT ON; 
    BEGIN 
     SET @sSQL = 'SELECT A.[submissionID], 
          A.[subEmpID], 
          A.[nomineeEmpID], 
          CONVERT (VARCHAR (10), A.[submissionDate], 101) AS submissionDate, 
          A.[situation], 
          A.[task], 
          A.[action], 
          A.[result], 
          A.[timestamp], 
          A.[statusID], 
          A.[approver], 
          A.[approvalDate], 
          B.[FirstName] + '' '' + B.[LastName] AS nomineeName, 
          B.[ntid] AS nomineeNTID, 
          B.[qid] AS nomineeQID, 
          C.[FirstName] + '' '' + C.[LastName] AS submitName, 
          C.[ntid] AS submitNTID, 
          D.[categoryName] 
        FROM  empowermentSubmissions AS A 
          INNER JOIN 
          empTable AS B 
          ON A.[nomineeEmpID] = B.[empID] 
          INNER JOIN 
          empTable AS C 
          ON A.[subEmpID] = C.[empID] 
          INNER JOIN 
          empowermentCategories AS D 
          ON A.[categoryID] = D.[catID]'; 
     IF (@category) IS NOT NULL 
      SET @Where = @Where + ' AND A.[categoryID] = @_category'; 
     IF LEN(@Where) > 0 
      SET @sSQL = @sSQL + ' 
      WHERE ' + RIGHT(@Where, LEN(@Where) - 4); 
     EXECUTE sp_executesql @sSQL, N'@_category', @_category = @category; 
    END 
END 

这里是你的代码最初打印,如果你想看到的问题。

SELECT A.[submissionID], 
          A.[subEmpID], 
          A.[nomineeEmpID], 
          CONVERT (VARCHAR (10), A.[submissionDate], 101) AS submissionDate, 
          A.[situation], 
          A.[task], 
          A.[action], 
          A.[result], 
          A.[timestamp], 
          A.[statusID], 
          A.[approver], 
          A.[approvalDate], 
          B.[FirstName] + " " + B.[LastName] AS nomineeName, 
          B.[ntid] AS nomineeNTID, 
          B.[qid] AS nomineeQID, 
          C.[FirstName] + " " + C.[LastName] AS submitName, 
          C.[ntid] AS submitNTID, 
          D.[categoryName] 
        FROM  empowermentSubmissions AS A 
          INNER JOIN 
          empTable AS B 
          ON A.[nomineeEmpID] = B.[empID] 
          INNER JOIN 
          empTable AS C 
          ON A.[subEmpID] = C.[empID] 
          INNER JOIN 
          empowermentCategories AS D 
          ON A.[categoryID] = D.[catID]WHERE D A.[categoryID] = @_category 
0

您需要将双引号更改为两个单引号:

B.[FirstName] + '' '' + B.[LastName] AS nomineeName, 
C.[FirstName] + '' '' + C.[LastName] AS submitName, 

编辑: 还需要在前面的空间,在这条线:

SET @sSQL = @sSQL + ' WHERE ' + RIGHT(@Where, LEN(@Where) - 3); 
0

我想你”如果你想把'AND'关掉,就不要从你的@Where变量开始剥离足够的字符。这是5个字符,而不是三个。

在任何情况下,这是没有必要的,因为在WHERE子句中只会有一个条件(所以你可以在第一个地方放弃AND,而不是放入然后再将其除去),但我想你打算让这变得更加复杂?

+0

是的,它会有更多的片断,但需要先处理它1 – SBB

0

顺便问一下,你也可以做

@Where AS NVARCHAR (1000) = ' (1=1) '; 

然后,你可以添加任意数量的“AND ......”你喜欢不进一步的字符串处理。

+0

你是什么意思“进一步字符串处理“? – SBB

+0

我只是说你可以使用'@ Where'而不是'RIGHT(@Where,LEN(@Where)-3)'。错误机会少一个。 – JimmyB