T-Sql - 将日期时间列名参数从VARCHAR转换为时间

时间:2017-08-03 03:12:35

标签: sql-server date datetime time parameters

我有一个datetime列名[dbo].[Bus Station],我希望将其作为参数@StationName

在T-SQL脚本中传递
DECLARE @CurrentTime TIME(0) = '20:53:00',
    @StationName TIME(0), -- Datetime Column Name
    @BusTime TIME(0);

SET @StationName = '[dbo].[Bus Station]'

SET @BusTime = (SELECT TOP 1 @StationName 
                FROM dbo.R1_pvt 
                WHERE @StationName >= CONVERT (time(0), @CurrentTime))

SELECT DateDiff(mi, @CurrentTime, @BusTime) % 60    As Minutes

我该怎么办? :(

1 个答案:

答案 0 :(得分:1)

您希望执行的是执行动态SQL语句。这可以完成,但您必须小心,因为根据输入来自用于构建查询的输入,您可能容易受到SQL注入攻击。在微软关于这种方法的信息页面上,它说:

  

重要提示:在使用字符串调用EXECUTE之前,请进行验证   字符串。永远不要执行从用户构造的命令   未经验证的输入。

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/execute-transact-sql

要执行动态SQL语句,请在字符串(通常是varchar)变量中构建查询,然后执行它。通过使用EXECUTE()命令或调用sp_executesql系统存储过程完成了这项工作。

-- variable to store the query
DECLARE @query varchar(500)

-- build the query
SET @query = 'SELECT TOP 1 ' + @StationName + ' FROM dbo.R1_pvt WHERE ' + @StationName + ' >= CONVERT(time(0), ''' + CAST(@CurrentTime as varchar) + ''' )'

-- execute the query
EXECUTE(@query);

在您的情况下,您还想要返回一个值。这可以完成,并已在本网站的其他地方得到了很好的介绍。我建议你看一下Stack Overflow上的这个问题:

Getting result of dynamic SQL into a variable for sql-server