【问题标题】:T-Sql - Convert datetime column name parameter from VARCHAR to timeT-Sql - 将日期时间列名参数从 VARCHAR 转换为时间
【发布时间】:2017-08-03 03:12:35
【问题描述】:

我有一个datetime 列名[dbo].[Bus Station],我想在T-SQL 脚本中将它作为参数@StationName 传递给@

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

我该怎么做? :(

【问题讨论】:

  • 我认为您的查询可能有一些错误。您正在为@StationName 分配一个字符串,但它被定义为TIME(0)。此外,您的查询看起来像是在尝试返回 Time,但您选择的是要传入的任何字段名称(在您的示例中为 @StationName

标签: sql-server date datetime time parameters


【解决方案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

【讨论】:

  • 非常感谢亲爱的,它真的帮助了我:),
  • 但是,如何将 [DateDiff(mi, @CurrentTime, @BusTime)] 与 [EXECUTE(@query)] 一起使用?
  • 只需将这些合并到您正在构建的查询中。最简单的方法是像往常一样构建您的查询,并使其正常工作。获得有效的静态查询后,将其转换为动态查询。
猜你喜欢
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多