0

これは正しく実行されます:(実際に実行するために日付までに''を使用する必要があったのは奇妙です)

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 ''+@from+'' AND ''+@to+'' ORDER BY statdate'

execute(@query)

次のエラーが発生します:文字列をsmalldatetimeデータ型に変換するときに変換に失敗しました

whereステートメントを次のように変更します。

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

それでも同じエラーが発生しますが、日付を変数として置き換えることができないようです

4

2 に答える 2

1

''は奇妙ではありません。これは、varchar内のアポストロフィを有効にする表記法です。

連結するときは、(n)varcharsと(n)chars以外のものを連結しようとしていないことを確認してください。SQLServerはそれらを他のデータ型に変換しようとするためです。あなたの場合、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', @from=@from_variable, @to=@to_variable

ここで、@ from_variableと@to_variableは、バッチで以前に定義された日時変数です。

アップデート:

最終的な目標がこのコードをストアドプロシージャでラップすることである場合、テンプレートは次のとおりです。

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', @from=@dateFrom, @to=@dateTo
于 2012-05-28T12:36:07.013 に答える
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', @FromDate=@internal_fromdate, @ToDate=@internal_todate

アップデート

わかりました、私は次のバリエーションを試しました:

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', @table=@tableName,@from=@dateFrom, @to=@dateTo

エラー:テーブル変数「@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"を宣言する必要があります。

問題の解決方法がわかりません

于 2012-05-28T13:07:29.537 に答える