2017-04-11 7 views
0

を実行することができますので、私は、次のSQL Serverのストアドプロシージャ持つストアドプロシージャにSQL Serverのステートメントを渡す:私は使用してそれを実行ストアドプロシージャが彼らに

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

-- ============================================= 
-- Create date: April 4 2017 
-- Description: This stored procedure deletes a selected row from the table. 
-- ============================================= 
ALTER PROCEDURE [dbo].[StoredProcedureTestbench_Delete] 
    @TestKey INT = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; -- NOCOUNT 

    -- This always deletes the last record from the table. 
    DELETE FROM StoredProcedureTest 
    WHERE TestKey = (SELECT MAX(TestKey) FROM StoredProcedureTest)  
END; 
RETURN 

を:

/* This routine executes the stored procedure that deletes a selected StoredProcedureTestbench table row */ 
SET QUOTED_IDENTIFIER ON 
GO 

DECLARE @ReturnCode int; 

EXECUTE @ReturnCode = dbo.StoredProcedureTestbench_Delete 
BEGIN 
    SELECT @ReturnCode AS Return_Code 
END; 
GO 

すると、それは可能ですストアドプロシージャをパラメータとしてストアドプロシージャを呼び出すプロシージャから'(SELECT MAX(TestKey) FROM StoredProcedureTest)'を渡しますか?

もっと一般的な意味で、ストアドプロシージャにSQL Serverステートメントを渡して、ストアドプロシージャで実行できるようにするにはどうすればよいですか?

+7

「ストアドプロシージャは彼らに を実行することができるように、ストアドプロシージャにSQL Serverのステートメントを渡す」 - ちょうどありません! –

+4

可能であれば、フラグメントからSQLをアセンブルしないでください。フラグメントからアセンブルする場合は、SQLインジェクションのリスクを避けるために非常に徹底的に行う必要があります。 –

+3

これは可能で簡単です。しかし、... _Alert_誰もあなたにそれを示唆することはありません。上記のコメントを真剣に受け止めてください。 – niksofteng

答えて

0

私はあなたにそのやり方を教えてくれますが、あなたがしていることが真剣に安全であることを真剣に考えてはいけないと言っているすべてのコメントをお読みください。

SQLインジェクションとは、「drop database」のようなテキストに対してユーザーがsqlパラメーターを変更しないようにするために、すべてのテーブルのデータをすべて選択することです。

あなたは、その文字列を作成するようにあなたは、自分をパラメータことを制御し、あなたはそれが安全であることを確認している場合、あなたはそのような何かを行うことができます:

sp_executesqlをお使いの動的に作成されたSQLを実行します。

ALTER PROCEDURE [dbo].[StoredProcedureTestbench_Delete] @sqltextparameter varchar(max), 
    @TestKey INT = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 

declare @executestatement varchar(max) 
    set @executestatement = 'DELETE FROM StoredProcedureTest 
    WHERE TestKey =' 

    exec sp_executesql @executestatement + @sqltextparameter 
END; 
RETURN 

以降だけパラメータとしてあなたのテキストを追加し、それを実行します。

/* This routine executes the stored procedure that deletes a selected StoredProcedureTestbench table row */ 
SET QUOTED_IDENTIFIER ON 
GO 

DECLARE @ReturnCode int; 

EXECUTE @ReturnCode = dbo.StoredProcedureTestbench_Delete '(SELECT MAX(TestKey) FROM StoredProcedureTest)' 
BEGIN 
    SELECT @ReturnCode AS Return_Code 
END; 
GO