2016-05-11 3 views
1

は、ここで私はSQL関数にinsert文を入れるには?

CREATE FUNCTION [dbo].[CreateNewRow] 
(@pFirstName VARCHAR(50), @pLastName VARCHAR(50)) 
RETURNS INT 
AS 
BEGIN 

INSERT INTO [dbo].[Student] ([FirstName], [LastName]) 
VALUES (@pFirstName, @pLastName) 

RETURN SCOPE_IDENTITY() 
END 
GO 

が可能なら、私は別の方法を教えてくださいしようとしている私の関数です。

+0

この動作はサポートされていません。ストアドプロシージャのチェック... '副作用演算子 'INSERT'を関数内で使用していません。 – Devart

+2

SQL Serverの関数でDML演算を使用できません。ストアドプロシージャを使用できます。 https://social.msdn.microsoft.com/Forums/sqlserver/en-US/79be4014-3a05-4b48-a723-ac7888ff59df/why-dml-operations-are-not-allowed-in-functions-in-sql- server?forum = transactsql –

答えて

1

InsertはSQL関数では機能しません。関数は以下のエラーを返します。

サーバー:メッセージ443、レベル16、状態2、手順CreateNewRow、7行 関数内で '挿入' の不正使用。

INSERTコマンドを使用するが、変更された表関数にローカル変数テーブルである代替 使用ユーザ定義関数:

CREATE FUNCTION [dbo].[Ins_GetMaxValue] 
(@pInt1 INT, @pInt2 INT, @pInt3 INT, @pInt4 INT) 
RETURNS INT 
AS 
BEGIN 
DECLARE @IntTable TABLE ([IntValue] INT) 
DECLARE @MaxValue INT 

INSERT INTO @IntTable ([IntValue]) VALUES (@pInt1) 
INSERT INTO @IntTable ([IntValue]) VALUES (@pInt2) 
INSERT INTO @IntTable ([IntValue]) VALUES (@pInt3) 
INSERT INTO @IntTable ([IntValue]) VALUES (@pInt4) 

SELECT @MaxValue = MAX([IntValue]) 
FROM @IntTable 

RETURN @MaxValue 
END 
GO 
1

ストアドプロシージャ

CREATE PROCEDURE [dbo].[CreateNewRow] @pFirstName VARCHAR(50) 
    ,@pLastName VARCHAR(50) 
AS 
BEGIN 
    INSERT INTO [dbo].[Student] (
     [FirstName] 
     ,[LastName] 
     ) 
    VALUES (
     @pFirstName 
     ,@pLastName 
     ) 

    SELECT SCOPE_IDENTITY() 
END 
GO 

にを使用してみてくださいストアドプロシージャを呼び出す

EXEC CreateNewRow @pFirstName = 'Xxx' 
    ,@pLastName = 'Yyy' 
関連する問題