0

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

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

谢谢!

4

5 回答 5

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后续测试以测试您的查询是否已正确构建。

于 2013-10-23T08:57:38.877 回答
0

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

于 2013-10-23T08:58:38.120 回答
0

将您的 where 条件更改为此。在执行之前还要打印它并更正'此处使用的数字。

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

于 2013-10-23T09:04:31.490 回答
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
于 2013-10-23T09:27:29.310 回答
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
于 2013-10-23T09:33:47.720 回答