より安全な代替手段を次に示します:
ALTER PROCEDURE dbo.queryfunctions
@Tabname NVARCHAR(511),
@colname NVARCHAR(128),
@valuesname VARCHAR(150)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'SELECT * FROM ' + @Tabname
+ ' WHERE ' + QUOTENAME(@colname) + ' = @v';
EXEC sp_executesql @sql, N'@v VARCHAR(150)', @valuesname;
END
GO
EXEC dbo.queryfunctions N'dbo.education', N'eduChildName', 'Revathi';
何を変更しましたか?
<オール>dbo
を使用する オブジェクトを作成/参照するときのプレフィックスNVARCHAR
です できます 150文字以上であること。将来誰かが追加する可能性のあるテーブルに対応するパラメーターを許可する方がはるかに安全です。SET NOCOUNT ON
を追加しました ネットワークのオーバーヘッドを防ぎ、誤った結果セットをクライアントに送信する可能性があります。@sql
常に NVARCHAR
である必要があります .QUOTENAME
を使用 SQL インジェクションを阻止し、不適切な名前 (キーワードなど) から保護するために、テーブルや列などのエンティティ名の前後に配置します。