2017-08-03 42 views
0

我有一个datetime列名[dbo].[Bus Station],我想它在T-SQL脚本作为参数传递@StationNameT-SQL - 从VARCHAR转换datetime列名参数时

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 

我该怎么办呢? :(

+0

我想你可能在你的查询的一些错误。您将一个字符串分配给'@ StationName',但它被定义为'TIME(0)'。此外,你的查询看起来像你正在试图返回一个'时间',但是你选择了任何字段名称将被传入(在你的例子中它是'@ StationName'。 – STLDeveloper

回答

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); 

在你的情况下,你也想返回一个值。这可以完成,并已在本网站其他地方很好地覆盖。我建议你看一看上堆栈溢出这样的问题:

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

+0

非常感谢你亲爱的,它真的帮助我:), – user3872646

+0

但是,如何与[EXECUTE(@query)]一起使用[DateDiff(mi,@CurrentTime,@BusTime)]? – user3872646

+0

只需将这些添加到您正在构建的查询中即可。最简单的方法就是像平常一样构建查询,并使其工作。一旦你有一个工作的静态查询,将其转换为动态查询。 – STLDeveloper