- Du skal kun søge efter kolonner, der faktisk indeholder strenge, ikke alle kolonner i en tabel (som kan omfatte heltal, datoer, GUID'er osv.).
- Du burde slet ikke have brug for en #temp tabel (og bestemt ikke en ##temp tabel).
- Du skal bruge dynamisk SQL (selvom jeg ikke er sikker på, om dette har været en del af dit læseplan indtil videre).
- Jeg finder det en fordel at følge nogle få simple konventioner
, som du alle har overtrådt:
- brug
PROCEDURE
ikkePROC
- det er ikke en "prock", det er en "lagret procedure." - brug
dbo.
(eller alternativt skema) præfiks, når der henvises til ethvert objekt . - indpak din proceduretekst i
BEGIN
/END
. - brug vokaler rigeligt. Sparer du så mange tastetryk, pyt med tid ved at sige
@tblname
i stedet for@tablename
eller@table_name
? Jeg kæmper ikke for en bestemt konvention, men at gemme karakterer på bekostning af læsbarhed mistede sin charme i 70'erne. - brug ikke
sp_
præfiks for lagrede procedurer - dette præfiks har en særlig betydning i SQL Server. Navngiv proceduren for, hvad den gør. Det behøver ikke et præfiks, ligesom vi ved, at det er tabeller, selv uden entbl
præfiks. Hvis du virkelig har brug for et præfiks der, så brug et andet somusp_
ellerproc_
men jeg føler personligt ikke, at præfikset giver dig nogen information, du ikke allerede har. - da tabeller er gemt ved hjælp af Unicode (og nogle af dine kolonner kan også være det), skal dine parametre være
NVARCHAR
, ikkeVARCHAR
. Og identifikatorer er begrænset til 128 tegn, så der er ingen grund til at understøtte> 257 tegn for@tablename
. - afslut udsagn med semikolon .
- brug katalogvisningerne i stedet for
INFORMATION_SCHEMA
- selvom det sidste er, hvad din professor måske har undervist i og kunne forvente.
- brug
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
Når du er glad for, at den udsender SELECT
forespørgsel du leder efter, kommenter PRINT
og fjern kommentaren til EXEC
.