- Musíte hledat pouze sloupce, které skutečně obsahují řetězce, nikoli všechny sloupce v tabulce (která může obsahovat celá čísla, data, GUID atd.).
- Vůbec byste neměli potřebovat #temp tabulku (a už vůbec ne ##temp tabulku).
- Musíte používat dynamické SQL (ačkoli si nejsem jistý, zda to bylo doposud součástí vašeho učebního plánu).
- Považuji za přínosné sledovat několik jednoduché konvence
, které jste všechny porušili:
- použijte
PROCEDURE
nePROC
- není to "prock", je to "uložená procedura." - použijte
dbo.
(nebo alternativní schéma) předpona při odkazování na jakýkoli objekt . - zabalte tělo procedury do
BEGIN
/END
. - volně používat samohlásky. Ušetříte tolik úhozů, bez ohledu na čas, když řeknete
@tblname
místo@tablename
nebo@tablename
? Nebojuji za konkrétní konvenci, ale záchrana znaků za cenu čitelnosti ztratila v 70. letech své kouzlo. - nepoužívejte
sp_
prefix pro uložené procedury - tento prefix má v SQL Server speciální význam. Pojmenujte postup, co dělá. Nepotřebuje předponu, stejně jako víme, že jsou to tabulky i beztbl
předpona. Pokud tam opravdu potřebujete předponu, použijte jinou, napříkladusp_
neboproc_
ale osobně nemám pocit, že by vám tato předpona poskytovala nějaké informace, které byste ještě neměli. - protože jsou tabulky uloženy pomocí Unicode (a některé vaše sloupce mohou být také), vaše parametry by měly být
NVARCHAR
, nikoliVARCHAR
. A identifikátory jsou omezeny na 128 znaků, takže není důvod podporovat> 257 znaků pro@tablename
. - ukončit příkazy středníkem .
- použijte zobrazení katalogu namísto
INFORMATION_SCHEMA
- ačkoli to je to, co váš profesor možná učil a mohl očekávat.
- použijte
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
Když jste spokojeni, že to vydává SELECT
dotaz, který hledáte, zakomentujte PRINT
a odkomentujte EXEC
.