2017-07-29 6 views
0

私は表関数が、エラーを返したいが関数内で副作用オペレータ「INSERTのEXEC」のストアドプロシージャを使用せずにテーブル関数の戻り値execを返す方法はありますか?

無効な使用です。

私のコード:sp_executesql含む

CREATE FUNCTION [dbo].[Fn_GetTable] 
    (@ID AS NVARCHAR(MAX)) 
RETURNS 
     @Tbl TABLE (ID NVARCHAR(MAX)) 
AS 
BEGIN 
    DECLARE @str AS NVARCHAR(MAX) 

    SET @str = 'SELECT * FROM support WHERE support IN ('[email protected]+')' 

    INSERT INTO @Tbl (ID) 
     EXEC sp_executesql @str 

    RETURN 
END 

答えて

0

手順は、UDFで禁止されています。 https://docs.microsoft.com/en-us/sql/relational-databases/user-defined-functions/create-user-defined-functions-database-engine

なぜここで動的になる必要はありません。試してみてください。

Create FUNCTION [dbo].[Fn_GetTable] (
@ID as nvarchar(MAX) 
) 
RETURNS 
@Tbl TABLE (
ID nvarchar(MAX) 
) AS 
BEGIN 

    INSERT INTO @Tbl (ID) 
    select * 
    from support 
    where support in (@ID) 

RETURN 
END 

もしパラメータがリストを表すとすれば、そのためにUDTを使うのがよいでしょう。 https://docs.microsoft.com/en-us/sql/relational-databases/clr-integration-database-objects-user-defined-types/working-with-user-defined-types-in-sql-server。デモ

CREATE TYPE dbo.UDT_IDS AS TABLE (ID NVARCHAR(MAX)) ; 

おそらくパラメータが所望のように、これは動作しません、その場合、カンマ区切り文字列が含まれているパラメータ

CREATE FUNCTION [dbo].[Fn_GetTable] (
@IDS as dbo.UDT_IDS READONLY 
) 
RETURNS 
@Tbl TABLE (
ID NVARCHAR(MAX) 
) AS 
BEGIN 

    INSERT INTO @Tbl (ID) 
    SELECT support 
    FROM support 
    WHERE support in (SELECT ID FROM @IDS) 

RETURN 
END 
+1

としてそれを使用します。 –

+0

@MartinSmith UDTテーブルは、リストをパラメータとして渡すための適切なツールです。 – Serg

関連する問題