在sql SP中创建动态

时间:2013-10-23 08:54:30

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

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

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语句
任何人都可以提供帮助

谢谢!

5 个答案:

答案 0 :(得分:2)

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

因此,你的@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之后测试您的查询是否已正确构建。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

将您的位置条件更改为此。同时在执行前打印并更正此处使用的数字'

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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