2012-03-07 69 views
14

テーブルを返す関数を書いています。関数に渡される2つのパラメータがあり、クエリがビルドされて実行され、返されるテーブルに挿入されます。しかし、私はこのエラーを受け取ります。関数から動的SQLを呼び出す

関数内でのみ、関数と拡張ストアドプロシージャを実行できます。

これは単純なユーティリティ関数であるため、ストアドプロシージャは使用しません。これができるかどうか誰にも分かります。私の関数は以下のようにコード化されています。

-- ============================================= 
-- AUTHOR:  JON AIREY 
-- THIS FUNCTION WILL RETURN A COUNT OF HOW MANY 
-- TIMES A CERTAIN COLUMN VALUE APPEARS IN A 
-- TABLE. THIS IS HELPFUL FOR FINDING DUPES. 

-- THIS FUNCTION WILL ACCEPT A COLUMN NAME, TABLE 
-- NAME (MUST INCLUDE SCHEMA), AND OPTIONAL 
-- DATABASE TO USE. RESULTS WILL BE RETURNED AS 
-- A TABLE. 
-- ============================================= 
ALTER FUNCTION [dbo].[fn_FindDupe] 
( 
-- Add the parameters for the function here 
@Column  VARCHAR(MAX), 
@Table  VARCHAR(100), 
@Database VARCHAR(100) = '' 
) 
RETURNS 
@TempTable TABLE 
     ([Column] varchar(100) 
     ,[Count] int) 
AS 
BEGIN 
    DECLARE @SQL VARCHAR(MAX) 
    SET @Table = CASE 
         WHEN @Database = '' 
         THEN @Table 
         ELSE @Database + '.' + @Table 
        END 

    SET @SQL = 

    ' 
     INSERT INTO @TempTable 

     SELECT  ' + @Column + ' 
        ,COUNT(' + @Column + ') AS CNT 
     FROM  ' + @Table + ' 
     GROUP BY ' + @Column + ' 
     ORDER BY CNT DESC 
    ' 

    EXEC SP_EXECUTESQL @SQL 

RETURN 
END 
GO 

答えて

21

You can't use dynamic sql in a udf

この非常にシンプル:あなたは、T-SQLで書かれた使用定義 関数からの動的SQLを使用することはできません。これは、あなたが許可されていないためです。 データベースの状態を変更する可能性のあるもの(UDFが をクエリの一部として呼び出す可能性があるため)をUDF内に作成することはできません。更新を含む動的な SQLから何かを行うことができるので、動的SQLに が許可されない理由は明らかです。

... SQL 2005で

以降では、CLR 関数としてあなたの関数を実装することができます。 CLRからのすべてのデータアクセスが動的SQLであることを思い出してください。 (安全に保護されているので、関数 から更新操作を実行すると、あなたは捕まってしまいます)警告の言葉:スカラーUDFからのデータ アクセスはパフォーマンス上の問題を引き起こすことがあります。

+0

どうすればこの機能をCLRにすることができますか? – JBone

+0

[方法:CLR SQL Serverユーザー定義関数の作成と実行](http://msdn.microsoft.com/en-us/library/w2kae45k(v = vs80).aspx) –

+1

'更新を含む動的SQLから何かを行うと、動的SQLがなぜ許可されないのかは明らかです。しかし、同時にあなたは、例えば、あなたの動的SQLを解析する必要があります。 sp_executesql()を使用すると、SQL Serverはクエリを変更して他のユーザーに渡す可能性があります。 それは本当の理由です - 彼らはそれを実装する気にしなかったのですか? –

関連する問題