在sql SP中创建动态位置
我正在尝试创建一个将存储一些值的存储库,其中一个值是列名和一个值。在sql SP中创建动态位置,sql,sql-server,stored-procedures,dynamic,where,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 '+
我尝试了以下代码
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
从字符串转换日期和/或时间时,它给我这个错误。转换失败。
我不是SQL专家,这是我第一个动态SQL语句
有人能帮忙吗
谢谢 在构建动态查询时,必须转义引号 因此,@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) + ''
转义是通过将引号加倍来完成的
您可以在之后执行
选择@SQL
来测试您的查询是否正确构建。我认为TicketDate列是一个varchar字段,您将日期存储为13/10/2013
或10/13/2013
。如果是这种情况,请告诉use您是如何存储TicketDate数据的,然后我们可以帮助您。将where条件更改为此。执行前也要打印,并更正此处使用的编号“
其中t.TicketDate介于“”+转换(varchar,@DateFrom)+''和“”+转换(varchar,@DateTo)+''和“”+@ColumName++''=''转换(varchar,@ColumID)+''之间
将sql字符串创建为
SELECT *
FROM Ticket t
WHERE t.TicketDate BETWEEN '10-23-2013' AND '10-23-2013' AND A=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
表中的列是datetime并允许null@kirokaram完成,现在测试它。
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