- Devi cercare solo nelle colonne che contengono effettivamente stringhe, non in tutte le colonne di una tabella (che possono includere numeri interi, date, GUID, ecc.).
- Non dovresti aver bisogno di una tabella #temp (e certamente non di una tabella ##temp).
- Devi usare SQL dinamico (anche se non sono sicuro che questo sia stato parte del tuo curriculum finora).
- Trovo utile seguirne alcuni semplici convenzioni
, che hai violato tutti:
- usa
PROCEDURE
nonPROC
- non è un "prock", è una "procedura memorizzata". - usa
dbo.
(o schema alternativo) prefisso quando si fa riferimento a qualsiasi oggetto . - avvolgi il corpo della procedura in
BEGIN
/END
. - usa le vocali liberamente. Stai risparmiando così tante battute, non importa tempo, dicendo
@tblname
invece di@tablename
o@table_name
? Non sto combattendo per una convenzione specifica, ma salvare i personaggi a scapito della leggibilità ha perso il suo fascino negli anni '70. - non utilizzare
sp_
prefisso per le stored procedure:questo prefisso ha un significato speciale in SQL Server. Assegna un nome alla procedura per ciò che fa. Non ha bisogno di un prefisso, proprio come sappiamo che sono tabelle anche senza untbl
prefisso. Se hai davvero bisogno di un prefisso, usane un altro comeusp_
oproc_
ma personalmente non credo che quel prefisso ti dia informazioni che non hai già. - poiché le tabelle sono archiviate utilizzando Unicode (e potrebbero esserlo anche alcune delle tue colonne), i tuoi parametri dovrebbero essere
NVARCHAR
, nonVARCHAR
. E gli identificatori hanno un limite di 128 caratteri, quindi non c'è motivo di supportare> 257 caratteri per@tablename
. - termina le affermazioni con punto e virgola .
- usa le viste del catalogo invece di
INFORMATION_SCHEMA
- anche se quest'ultimo è ciò che il tuo professore potrebbe aver insegnato e potrebbe aspettarsi.
- usa
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
Quando sei felice che stia emettendo il SELECT
query che stai cercando, commenta il PRINT
e decommenta il EXEC
.