2012-05-28 59 views
0

这正确执行:(这是奇怪的,我需要的日期用'它实际上执行)SQL Server查询日期发行

DECLARE 
@cols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX); 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.statcolumnname) FROM [85137_PHY_Long_PG] c FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

set @query = 'SELECT statdate, ' + @cols + ' from 
     (
      select statdate, statcolumnname, statcolumnvalue 
      from [85137_PHY_Long_PG] 
     ) x 
     pivot 
     (
      min(statcolumnvalue) 
      for statcolumnname in (' + @cols + ') 
     ) p WHERE statdate BETWEEN ''2012-04-01 12:15:00'' AND ''2012-04-01 12:45:00''  ORDER BY statdate' 

execute(@query) 

现在我想用变量替换日期:

DECLARE 
@cols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX), 
@from AS NVARCHAR(MAX), 
@to AS NVARCHAR(MAX); 

set @from = '2012-04-01 12:15:00' 
set @to = '2012-04-01 12:45:00' 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.statcolumnname) FROM [85137_PHY_Long_PG] c FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

set @query = 'SELECT statdate, ' + @cols + ' from 
     (
      select statdate, statcolumnname, statcolumnvalue 
      from [85137_PHY_Long_PG] 
     ) x 
     pivot 
     (
      min(statcolumnvalue) 
      for statcolumnname in (' + @cols + ') 
     ) p WHERE statdate BETWEEN ''[email protected]+'' AND ''[email protected]+'' ORDER BY statdate' 

execute(@query) 

我得到以下错误:转换把字符串时SMALLDATETIME数据类型

更改失败where语句到t他以下几点:

WHERE statdate BETWEEN ''+convert(smalldatetime,@from)+'' AND ''+convert(smalldatetime,@to)+'' ORDER BY statdate' 

仍然给我相同的错误,似乎就是无法更换日期作为变量

+0

你错过了一组撇号。 – Arvo

+0

我已经尝试过多种方法无济于事,sp_executesql似乎工作得很好 – Thomas

回答

1

“”是不奇怪;它是一种在varchars中启用撇号的符号。

当连接时,确保你没有尝试连接(n)varchars和(n)个字符以外的任何东西,因为Sql Server会尝试将它们转换为其他数据类型;在你的情况下,在smalldatetime。您可以通过在连接前/连接期间将参数日期显式转换为nvarchars来避免此问题,但更好的解决方案是使用sp_executesql和参数。

如果你把里面的查询参数:

set @query = 'SELECT statdate, ' + @cols + ' from 
    (
     select statdate, statcolumnname, statcolumnvalue 
     from [85137_PHY_Long_PG] 
    ) x 
    pivot 
    (
     min(statcolumnvalue) 
     for statcolumnname in (' + @cols + ') 
    ) p WHERE statdate BETWEEN @from AND @to ORDER BY statdate' 

你可以用参数来执行:

exec sp_executesql @query, N'@from datetime, @to datetime', @[email protected]_variable, @[email protected]_variable 

凡@from_variable和@to_variable是一批早期定义的日期时间变量。

UPDATE:

如果你的最终目标是在存储过程来包装这个代码,这里是一个模板:

create proc MyProc (@dateFrom smalldatetime, @dateTo smalldatetime) 
as 
DECLARE 
@cols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX); 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.statcolumnname) 
    FROM [85137_PHY_Long_PG] c 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 
set @query = 'SELECT statdate, ' + @cols + ' from 
    (
     select statdate, statcolumnname, statcolumnvalue 
     from [85137_PHY_Long_PG] 
    ) x 
    pivot 
    (
     min(statcolumnvalue) 
     for statcolumnname in (' + @cols + ') 
    ) p WHERE statdate BETWEEN @from AND @to ORDER BY statdate' 

exec sp_executesql @query, N'@from smalldatetime, @to smalldatetime', @[email protected], @[email protected] 
+0

噢好吧,很酷。得到它的工作,感谢man.Can感到困惑...下一个挑战是将其转换为存储过程。无聊的人... – Thomas

+0

是否可以传递实际日期2012-04-01 12;:15:00作为参数。不必按照图示设置它们。 – Thomas

+0

是的,你可以传递常量作为参数:'@ from ='2012-12-01 13:33:12'' –

0

。由此解决方案:

DECLARE 
@cols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX), 
@internal_fromdate AS SMALLDATETIME, 
@internal_todate AS SMALLDATETIME; 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.statcolumnname) FROM [85137_PHY_Long_PG] c FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

set @internal_fromdate = '2012-04-01 12:15:00'; 
set @internal_todate = '2012-04-01 12:45:00'; 

set @query = 'SELECT statdate, ' + @cols + ' from 
     (
      select statdate, statcolumnname, statcolumnvalue 
      from [85137_PHY_Long_PG] 
     ) x 
     pivot 
     (
      min(statcolumnvalue) 
      for statcolumnname in (' + @cols + ') 
     ) p WHERE statdate BETWEEN @FromDate AND @ToDate ORDER BY statdate' 

exec sp_executesql @query, N'@FromDate SMALLDATETIME, @ToDate SMALLDATETIME', @[email protected]_fromdate, @[email protected]_todate 

UPDATE

好吧,我已经尝试了以下变化:

create proc MyProc9 (@tableName varchar,@dateFrom smalldatetime, @dateTo smalldatetime) 
AS 
DECLARE 
@cols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX); 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.statcolumnname) 
FROM [85137_PHY_Long_MP] c 
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 
set @query = 'SELECT statdate, ' + @cols + ' from 
(
    SELECT statdate, statcolumnname, statcolumnvalue 
    from @table 
) x 
pivot 
(
    min(statcolumnvalue) 
    for statcolumnname in (' + @cols + ') 
) p WHERE statdate BETWEEN @from AND @to ORDER BY statdate' 

exec sp_executesql @query, N'@table varchar,@from smalldatetime, @to smalldatetime', @[email protected],@[email protected], @[email protected] 

错误:必须声明表变量 “@table”。

在@query字符串中尝试了'+ @ tableName +':'8'附近的语法错误。

在@query字符串中尝试'+ QUOTENAME(@tableName)+':无效的对象名称'8'。

在@query字符串中尝试['+ @ tableName +']:无效的对象名称'8'。

在@query字符串中尝试了QUOTENAME(@table):无效的对象名称'8'。

在@query字符串中尝试[85137_PHY_Long_MP]:正常工作,只是想替换它。

在@query字符串中尝试[@tableName]:无效的对象名称'@tableName'。

在@query字符串中尝试@tableName:必须声明表变量“@tableName”。

我不明白如何解决问题