代码之家  ›  专栏  ›  技术社区  ›  Jatin

检索卷计数的动态sql抛出错误语法错误[关闭]

  •  -1
  • Jatin  · 技术社区  · 6 月前

    我在以下位置遇到了不正确的语法错误 '且类型=0 在下面的动态sql中。我试图实现的是在导入id不包含companyId的特定日期之间获取导入活动的数量。我想我可能缺少开盘/收盘报价,但不确定。任何帮助都将不胜感激。谢谢!

    alter proc getVolumeCount
    (@DatabaseName varchar(100),
    @CompanyId as varchar(100),
    @FromDate as varchar(100),
    @ToDate as varchar(100)
    )
    as
    begin
    declare @SQL nvarchar(max)
    
    set @SQL = 'use '+@DatabaseName+ '
    select * from @Database.[dbo].[History]
    where 1=1
    and Cast(DateX as Date) between '+@FromDate+' and '+@ToDate
    'and Type=0 --this is where I am getting incorrect syntax error
    and Flags=3
    and Id not in 
            (select ImportId from Item where CompanyId in
            (Select CAST(Item as int) from dbo.fn_SplitString('+@CompanyId+','',''))
            )'
    
    exec sp_executesql @SQL
    
    END
    
    2 回复  |  直到 6 月前
        1
  •  2
  •   Ragnar    6 月前
    ALTER PROCEDURE getVolumeCount
    (
        @DatabaseName VARCHAR(100),
        @CompanyId VARCHAR(100),
        @FromDate VARCHAR(100),
        @ToDate VARCHAR(100)
    )
    AS
    BEGIN
        DECLARE @SQL NVARCHAR(MAX)
    
        SET @SQL = '
        USE ' + QUOTENAME(@DatabaseName) + ';
        SELECT * FROM ' + QUOTENAME(@DatabaseName) + '.[dbo].[History]
        WHERE 1=1
        AND CAST(DateX AS DATE) BETWEEN ''' + @FromDate + ''' AND ''' + @ToDate + '''
        AND Type = 0
        AND Flags = 3
        AND Id NOT IN 
        (
            SELECT ImportId FROM ' + QUOTENAME(@DatabaseName) + '.[dbo].[Item] 
            WHERE CompanyId IN 
            (
                SELECT CAST(Item AS INT) FROM dbo.fn_SplitString(''' + @CompanyId + ''', '','')
            )
        )'
    
        PRINT @SQL  
    
        EXEC sp_executesql @SQL
    END
    

    已使用 QUOTENAME(@DatabaseName) 以防止SQL注入和语法问题。 @FromDate @ToDate 单引号('')+ @起始日期 + '''). @CompanyId 正确内部 fn_SplitString 处理单引号。

        2
  •  2
  •   Bart McEndree    6 月前

    @ToDate后缺少一个+