我正在尝试创建一个存储的某些值,其中一个值是列名和值。
我尝试过以下代码
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语句
任何人都可以提供帮助
谢谢!
答案 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/2013
或10/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