【问题标题】:Expression of non boolean type specified on context where condition is expected near ')'在“)”附近预期条件的上下文中指定的非布尔类型的表达式
【发布时间】:2021-02-26 14:37:24
【问题描述】:

我使用 SQL Server 2012 我收到此错误:

在')'附近预期条件的上下文中指定的非布尔类型的表达式

我认为这是因为它无法处理 'N/A' OR Null 或 Text。

如何修改动态 SQL 以接受 N/A AND NULL ?

请问这个问题怎么解决?

我的样本数据

CREATE TABLE #Allfeatures
(
    ZPLID INT,
    ZFeatureKey nvarchar(20),
    IsNumericValue int
) 

INSERT INTO #Allfeatures (ZPLID, ZFeatureKey, IsNumericValue)
VALUES (75533, '1505730036', 0)
                    
CREATE TABLE #Condition
(
    Code nvarchar(20),
    ZFeatureKey nvarchar(20),
    ZfeatureType nvarchar(20),
    EStrat  nvarchar(20),
    EEnd NVARCHAR(10)
)

INSERT INTO #Condition (Code, ZFeatureKey, ZfeatureType, EStrat, EEnd)
VALUES ('8535400000', '1505730036', NULL, '>1000', ' '),
       ('8535400000', '1505730036', NULL, '>280AV', ' '),
       ('8535400000', '1505730036', NULL, 'N/A', ' '),
       ('8535400000', '1505730036', NULL, NULL, ' ')
                    
CREATE TABLE #PartAttributes
(
    PartID INT,
    ZFeaturekEY NVARCHAR(20),
    AcceptedValuesOption_Value INT,
    Name nvarchar(20)
)

INSERT INTO #PartAttributes (PartID, ZFeaturekEY, AcceptedValuesOption_Value, Name)
VALUES (4977941, 1505730036, 280, '280VDC'),
       (4977936, 1505730036, 280, '280VDC'),
       (4977935, 1505730036, 280, '280VDC')
                      
DECLARE @Sql nvarchar(max)
DECLARE @ConStr nvarchar(max)
                                
SET @ConStr = STUFF((SELECT CONCAT(' Or (PM.ZfeatureKey= ', CC.ZfeatureKey , IIF(CC.ZfeatureType='Qualifications',' And AcceptedValuesOption_Value ' , ' And translate(Name, ''VDCA'', space(4)) ' ) , CAST(
                        
                           cast(LEFT(SUBSTRING(EStrat, PATINDEX('%[<>0-9.-]%', EStrat), 2500),
             PATINDEX('%[^<>0-9.-]%', SUBSTRING(EStrat, PATINDEX('%[<>0-9.-]%', EStrat), 2500) + 'X') -1) as nvarchar(2500))
                  --EStrat 
                  AS NVARCHAR(2500)), ')')   
                        
                  FROM #Condition CC INNER JOIN #Allfeatures AL ON AL.ZfeatureKey = CC.ZfeatureKey AND AL.IsNumericValue =0
                  where EStrat <> 'N/A'
                  FOR XML PATH(''), TYPE).value('(./text())[1]','varchar(max)'),1,3,'')
     
  ----------------                    
  SET @Sql= CONCAT(' SELECT PartID, Code, Count(1) as ConCount
  FROM #PartAttributes PM 
  INNER JOIN #Condition Co ON Co.ZfeatureKey = PM.ZfeatureKey ',
  'Where 1=1 and (', @ConStr, ' ) Group By PartID,Code ' ,
  ' Having Count(1)> = ',(SELECT COUNT(1) FROM #Condition))
  EXEC (@SQL)

【问题讨论】:

标签: sql-server tsql stored-procedures sql-server-2012 sql-function


【解决方案1】:

TRANSLATE 在 SQL Server 2017 中引入

创建一个函数作为替代方法,如 here 或类似解释:

USE master
CREATE FUNCTION dbo.TRANSLATE
(
    @inputString NVARCHAR(MAX),
    @characters NVARCHAR(MAX),
    @translations NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @pos INT = 0;
    DECLARE @len INT = LEN(@characters)
    DECLARE @result NVARCHAR(MAX) = @inputString
    WHILE (@pos < @len)
    BEGIN
        SET @pos += 1
        SET @result = REPLACE(@result,SUBSTRING(@characters,@pos,1),SUBSTRING(@translations,@pos,1))
    END
    RETURN @result

END

要处理“N/A”或 NULL 文本,请展开

translate(Name, ''VDCA'', space(4))

part with(已经改成那个用户定义的函数)

CAST(LTRIM(RTRIM(ISNULL(master.dbo.translate(CASE WHEN Name = ''N/A'' THEN ''0'' ELSE Name END, ''VDCA'', space(4)),''0''))) AS INT)

以下内容看起来也不太正确(很确定您可以自行修复):

' Having Count(1)> = '

要进一步调试您的代码,请将EXEC (@SQL) 更改为PRINT @SQL 以查看实际执行的内容。

【讨论】:

    猜你喜欢
    • 2018-03-03
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多