- Anda hanya perlu mencari kolom yang benar-benar berisi string, tidak semua kolom dalam tabel (yang mungkin termasuk bilangan bulat, tanggal, GUID, dll).
- Anda seharusnya tidak memerlukan tabel #temp (dan tentu saja bukan tabel ##temp) sama sekali.
- Anda perlu menggunakan SQL dinamis (meskipun saya tidak yakin apakah ini telah menjadi bagian dari kurikulum Anda sejauh ini).
- Saya merasa bermanfaat untuk mengikuti beberapa konvensi sederhana
, yang semuanya telah kamu langgar:
- gunakan
PROCEDURE
bukanPROC
- ini bukan "prock", ini adalah "prosedur tersimpan". - gunakan
dbo.
(atau skema alternatif) awalan saat mereferensikan objek apa pun . - bungkus badan prosedur Anda dalam
BEGIN
/END
. - gunakan vokal secara bebas. Apakah Anda menyimpan banyak penekanan tombol, apalagi waktu, mengatakan
@tblname
bukannya@tablename
atau@table_name
? Saya tidak memperjuangkan konvensi tertentu, tetapi menyimpan karakter dengan mengorbankan keterbacaan kehilangan pesonanya di tahun 70-an. - jangan gunakan
sp_
awalan untuk prosedur tersimpan - awalan ini memiliki arti khusus dalam SQL Server. Sebutkan prosedur untuk apa yang dilakukannya. Itu tidak memerlukan awalan, sama seperti kita tahu bahwa itu adalah tabel bahkan tanpatbl
awalan. Jika Anda benar-benar membutuhkan awalan di sana, gunakan yang lain sepertiusp_
atauproc_
tapi saya pribadi tidak merasa bahwa awalan memberi Anda informasi apa pun yang belum Anda miliki. - karena tabel disimpan menggunakan Unicode (dan beberapa kolom Anda mungkin juga demikian), parameter Anda harus
NVARCHAR
, bukanVARCHAR
. Dan pengenal dibatasi 128 karakter, jadi tidak ada alasan untuk mendukung> 257 karakter untuk@tablename
. - akhiri pernyataan dengan titik koma .
- gunakan tampilan katalog alih-alih
INFORMATION_SCHEMA
- meskipun yang terakhir adalah apa yang mungkin telah diajarkan dan diharapkan oleh profesor Anda.
- gunakan
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
Saat Anda senang bahwa itu mengeluarkan SELECT
kueri yang Anda cari, beri komentar PRINT
dan batalkan komentar EXEC
.