2012-05-23 11 views
5

データベースプレフィックスを追加せずに、サーバー上の任意のデータベースで使用できるSQL Serverで関数を作成できますか?この機能を持つ例えばSQL Serverでグローバル関数を作成できますか?

、:

CREATE FUNCTION getDays (@date date) 
RETURNS INT 
AS 
BEGIN 

RETURN CASE WHEN MONTH(@date) IN (1, 3, 5, 7, 8, 10, 12) THEN 31 
      WHEN MONTH(@date) IN (4, 6, 9, 11) THEN 30 
      ELSE CASE WHEN (YEAR(@date) % 4 = 0 AND 
          YEAR(@date) % 100 != 0) OR 
          (YEAR(@date) % 400 = 0) 
         THEN 29 
         ELSE 28 
       END 
     END 

END 

答えて

14

あなたはマスターで関数(またはいくつかの他のパーマネント・データベース)を作成し、モデルのデータベースにシノニムを作成することができます

USE model; 
GO 
CREATE SYNONYM dbo.getDays FOR master.dbo.getDays; 

これは、任意の新しいデータベース内の関数へのシノニムを作成します。既存のデータベース(または将来追加または復元されるデータベース)では、そこに同義語をコピーする必要があります。これにより、コードのコピーを1つだけ保存するだけで、データベース内の2つの部分からなる名前でオブジェクトを参照することができます。

RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1, 
    DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date))))); 

だから、上から:

USE [master]; 
GO 
DROP FUNCTION dbo.getDays; 
GO 
CREATE FUNCTION dbo.getDays 
(
    @date DATE 
) 
RETURNS INT 
AS 
BEGIN 
    RETURN (SELECT DATEPART(DAY, DATEADD(DAY, -1, 
     DATEADD(MONTH, 1, DATEADD(DAY, 1-DAY(@date), @date))))); 
END 
GO 

今、各データベースで、このためのシノニムを作成するには:

DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql += CHAR(13) + CHAR(10) 
+ 'USE ' + QUOTENAME(name) + '; 

IF OBJECT_ID(''dbo.getDays'', ''FN'') IS NOT NULL 
    DROP FUNCTION dbo.getDays; 

IF OBJECT_ID(''dbo.getDays'', ''SN'') IS NOT NULL 
    DROP SYNONYM dbo.getDays 

CREATE SYNONYM dbo.getDays FOR master.dbo.getDays;' 
FROM sys.databases WHERE name <> 'master'; 

PRINT @sql; 

EXEC sp_executesql @sql; 
さておき、あなたのコードははるかに簡潔なことができるので

+0

'getDays'は認識された組み込み関数名ではありません。 –

+0

masterに関数を作成してから、モデルだけでなく既存のデータベースに同義語を作成する必要があります。モデルでシノニムを作成すると、シノニムがモデルで作成された後に作成される* new *データベースにのみ関数が作成されます。常にスキーマ接頭辞を使って関数やシノニムを参照する必要があるので、 'getDays'ではなく' dbo.getDays'でなければなりません。 –

+0

私はそれらの 'return'がどのように働くかを理解していません –

3

マスターにストアドプロシージャを作成すると、彼らは世界的に利用できるようになりますが、これは機能のために動作しません。

select <dbname>.<schema>.getDays(...) 

Microsoftがストアドプロシージャと異なる機能を使用するのはなぜですか?

+1

masterで関数を作成しても、他のデータベースで使用できるようにはなりません。この動作は、ストアドプロシージャの場合にのみ当てはまります。また、 'sp_configure'オプション' allow updates'が1に設定されている場合や、プロシージャの名前が 'sp_ 'の場合にのみ有効です。 –

+0

私はマスターで作成しましたが、スクリプトには表示されません –

+0

私はうんざりしました。 。 。私は答えを固定しています –

関連する問題