PROCEDURE
を使用PROC
ではありません - 「prock」ではなく、「ストアド プロシージャ」です。を使用コード> オブジェクトを参照するときの (または代替スキーマ) プレフィックス
.- プロシージャ本体を
BEGIN
で囲みます /ENDコード> .
- 母音を自由に使う。
@tblname
と言って、時間を気にせずに多くのキーストロークを節約できますか?@tablename
の代わりに または@table_name
?私は特定の慣習のために戦っているわけではありませんが、読みやすさを犠牲にして文字を保存することは、70 年代にその魅力を失いました. sp_
を使用しないでください ストアド プロシージャのプレフィックス - このプレフィックスは、SQL Server で特別な意味を持ちます。手順に名前を付けてください。tbl
がなくてもテーブルであることがわかっているように、プレフィックスは必要ありません。 プレフィックス。そこにプレフィックスが本当に必要な場合は、usp_
のような別のものを使用してください またはproc_
しかし、個人的には、プレフィックスがあなたがまだ持っていない情報を提供するとは思いません.- テーブルは Unicode を使用して保存されているため (一部の列もそうかもしれません)、パラメーターは
NVARCHAR
にする必要があります。 、VARCHAR
ではありません .また、識別子は 128 文字に制限されているため、@tablename
で 257 文字を超える文字をサポートする理由はありません。 . - ステートメントをセミコロンで終了する .
INFORMATION_SCHEMA の代わりにカタログ ビューを使用するコード>
- 後者は、教授が教えて期待したことかもしれませんが。
CREATE PROCEDURE dbo.SearchTable
@tablename NVARCHAR(257),
@term NVARCHAR(4000)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * FROM ' + @tablename + ' WHERE 1 = 0';
SELECT @sql = @sql + '
OR ' + c.name + ' LIKE ''%' + REPLACE(@term, '''', '''''') + '%'''
FROM
sys.all_columns AS c
INNER JOIN
sys.types AS t
ON c.system_type_id = t.system_type_id
AND c.user_type_id = t.user_type_id
WHERE
c.[object_id] = OBJECT_ID(@tablename)
AND t.name IN (N'sysname', N'char', N'nchar',
N'varchar', N'nvarchar', N'text', N'ntext');
PRINT @sql;
-- EXEC sp_executesql @sql;
END
GO
SELECT
が出力されていることに満足したら、 PRINT
をコメントアウトします。 EXEC
のコメントを外します .