7

SQL Server 2008、Visual Studio 2005、.net 2.0 SP2 を使用 (新しい SQL Server 2008 データ型をサポート)。

入力として DateTime2 を受け取り、別の DateTime2 を返す SQLCLR 関数を作成しようとしています。例:

using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

namespace MyCompany.SQLCLR
{
    public class DateTimeHelpCLR
    {
        [SqlFunction(DataAccess = DataAccessKind.None)]
        public static SqlDateTime UTCToLocalDT(SqlDateTime val)
        {
            if (val.IsNull)
                return SqlDateTime.Null;

            TimeZone tz = System.TimeZone.CurrentTimeZone;
            DateTime res = tz.ToLocalTime(val.Value);

            return new SqlDateTime(res);
        }
    }
}

これで、上記は正常にコンパイルされます。これらの SqlDateTimes を SQL Server の DateTime2 にマップしたいので、この T-SQL を実行してみます。

CREATE function hubg.f_UTCToLocalDT
(
    @dt DATETIME2
)
returns DATETIME2
AS
EXTERNAL NAME [SQLCLR].[MyCompany.SQLCLR.DateTimeHelpCLR].UTCToLocalDT
GO

これにより、次のエラーが発生します。

メッセージ 6551、レベル 16、状態 2、プロシージャ f_UTCToLocalDT、行 1 "f_UTCToLocalDT" の CREATE FUNCTION は、戻り値の T-SQL と CLR の型が一致しないため失敗しました。

(DATETIME2 の代わりに) DATETIME を使用すると問題なく動作します。しかし、精度の向上をサポートするには、むしろ DATETIME2 を使用したいと思います。私は何か間違ったことをしていますか、それとも DateTime2 は SQLCLR で (完全に) サポートされていませんか?

4

2 に答える 2

10

関数メソッドのシグニチャでDateTimeタイプを変更する必要があります。SQLDateTimeは、データベースのDateTimeにマップされます。

System.DateTimeはより正確で、 DateTime2にマップできます(ただし、デフォルトでは、デプロイスクリプトでDateTimeとしてドロップされます)。

[SqlFunction(DataAccess = DataAccessKind.None)]
//OLD Signature public static SqlDateTime UTCToLocalDT(SqlDateTime val) 
public static DateTime UTCToLocalDT(DateTime val) {
   ...
}

次に、デプロイスクリプトを微調整して読み取ることができます。

CREATE FUNCTION [UTCToLocalDT]
(
    @dt [datetime2]
)
RETURNS [datetime2]
AS
    EXTERNAL NAME [SQLCLR].[MyCompany.SQLCLR.DateTimeHelpCLR].UTCToLocalDT
GO

関数を実行すると、より正確な出力が得られるはずです。

DECLARE @input DateTime2, @output DateTime2
SET @input = '2010-04-12 09:53:44.48123456'
SET @output = YourDatabase.dbo.[UTCToLocalDT](@input)
SELECT @input, @output
于 2010-04-12T09:05:12.857 に答える
1

「DateTime?」を使用していることに注意してください。それでも常にビルドエラーが発生します(SQL 2012を使用したVS 2013でも)が、「ビルド、デプロイ」を選択してからobjフォルダー内のファイルを使用し、SQLクエリウィンドウで generated.sql ファイルを編集すると、明らかに結果が使用可能になります(DateTime2 をパラメーターとして使用するため) を実行して SQL Server に追加します。
ビルド エラーは「SQL46010: 不正な構文付近)」です。\obj\Debug\YourPrjName.generated.sql 内

(できればコメントとして上記に投稿します。)

于 2014-01-13T02:26:31.127 に答える