【问题标题】:create Dynamic where in sql SP在 sql SP 中创建动态 where
【发布时间】:2013-11-01 11:05:54
【问题描述】:

我正在尝试创建一个存储一些值,其中一个值是列名和一个值。
我试过下面的代码

create PROC SelectDynamic
@DateFrom DATETIME,
@DateTo DATETIME,
@ColumName NVARCHAR(50),
@ColumID INT
AS
DECLARE @Sql NVARCHAR(MAX)
SET @Sql=
'
SELECT
    *
FROM
    Ticket t 


WHERE t.TicketDate BETWEEN '+ @DateFrom +' AND' + @DateTo+' AND' + @ColumName +'='+ @ColumID

EXEC sp_executesql @Sql

它给了我这个错误Conversion failed when converting date and/or time from character string.
我不是 SQL 专家,我是第一个动态 sql 语句
谁能帮忙

谢谢!

【问题讨论】:

    标签: sql sql-server stored-procedures dynamic where


    【解决方案1】:

    我更喜欢手动替换和使用参数

    SET @Sql='
        SELECT *
        FROM Ticket  
        WHERE TicketDate BETWEEN @DateFrom AND @DateTo 
              AND {ColumName} = @ColumID
    '
    
    SET @Sql = REPLACE(@Sql, '{ColumnName}', QUOTENAME(@ColumnName))
    
    SET @Parameters = '
        @DateFrom AS datetime
       ,@DateTo AS datetime
       ,@ColumnID AS int
    '
    
    EXEC sp_executesql @Sql, @Parameters, @DateFrom, @DateTo, @ColumnID
    

    【讨论】:

      【解决方案2】:
      Try this
      
      declare @DateFrom DATETIME=getdate(),
              @DateTo DATETIME=getdate(),
              @ColumName NVARCHAR(50)='A',
              @ColumID INT=1
      
      DECLARE @Sql NVARCHAR(MAX)
      SET @Sql=
      '
      SELECT
          *
      FROM
          Ticket t 
      
      
      WHERE t.TicketDate BETWEEN '''+ convert(varchar,@DateFrom,110) +''' AND ''' + convert(varchar,@DateTo,110)+''' AND ' + @ColumName +'='+ convert(varchar,@ColumID)
      
      
      EXEC (@Sql)
      

      将sql字符串创建为

      SELECT      *  
      FROM      Ticket t       
      WHERE t.TicketDate BETWEEN '10-23-2013' AND '10-23-2013' AND A=1
      

      【讨论】:

        【解决方案3】:

        您必须在构建动态查询时转义引号。

        因此,您的 @SQL 变量应该是这样的

        SET @Sql= 'SELECT * FROM Ticket t WHERE t.TicketDate BETWEEN ''' + CAST(@DateFrom AS NVARCHAR) + ''' AND ''' + CAST(@DateTo AS NVARCHAR) + ''' AND ' + @ColumName +  '=' + CAST(@ColumID AS NVARCHAR) + ''
        

        转义是通过双引号来完成的。

        您可以在之后执行SELECT @SQL 来测试您的查询是否已正确构建。

        【讨论】:

        • @kirokaram 完成,立即测试。
        【解决方案4】:

        将您的 where 条件更改为此。执行前也要打印出来,更正​​这里使用的数字'

        WHERE t.TicketDate BETWEEN '''+ Convert(varchar,@DateFrom) +'''' AND''' + Convert(varchar,@DateTo)+'''' AND''' + @ColumName +''''='''+ Convert(varchar,@ColumID)+''''

        【讨论】:

          【解决方案5】:

          我认为 TicketDate 列是一个 varchar 字段,您将日期存储为 13/10/201310/13/2013 在 TicketDate 字段中。如果是这种情况,请告诉用户您是如何存储 TicketDate 数据的,我们可以为您提供帮助。

          【讨论】:

          • 表中的列是日期时间,允许为空
          猜你喜欢
          • 2016-08-02
          • 1970-01-01
          • 2011-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-06
          • 1970-01-01
          相关资源
          最近更新 更多