Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sql SP中创建动态位置_Sql_Sql Server_Stored Procedures_Dynamic_Where - Fatal编程技术网

在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