- U hoeft alleen kolommen te zoeken die daadwerkelijk tekenreeksen bevatten, niet alle kolommen in een tabel (die gehele getallen, datums, GUID's, enz. kunnen bevatten).
- Je zou helemaal geen #temp-tabel (en zeker geen ##temp-tabel) nodig moeten hebben.
- Je moet dynamische SQL gebruiken (hoewel ik niet zeker weet of dit tot nu toe deel uitmaakte van je curriculum).
- Ik vind het nuttig om een paar te volgen eenvoudige conventies
, die je allemaal hebt geschonden:
- gebruik
PROCEDURE
nietPROC
- het is geen "prock", het is een "opgeslagen procedure". - gebruik
dbo.
(of alternatief schema) voorvoegsel bij het verwijzen naar een object . - verpak je proceduretekst in
BEGIN
/END
. - gebruik klinkers royaal. Bespaar je zoveel toetsaanslagen, laat staan tijd, door
@tblname
te zeggen? in plaats van@tablename
of@table_name
? Ik vecht niet voor een specifieke conventie, maar het opslaan van karakters ten koste van de leesbaarheid verloor zijn charme in de jaren 70. - gebruik de
sp_
. niet voorvoegsel voor opgeslagen procedures - dit voorvoegsel heeft een speciale betekenis in SQL Server. Noem de procedure voor wat het doet. Het heeft geen voorvoegsel nodig, net zoals we weten dat het tabellen zijn, zelfs zonder eentbl
voorvoegsel. Als je daar echt een voorvoegsel nodig hebt, gebruik dan een andere, zoalsusp_
ofproc_
maar persoonlijk heb ik niet het gevoel dat dat voorvoegsel je informatie geeft die je nog niet hebt. - aangezien tabellen worden opgeslagen met Unicode (en sommige van uw kolommen kunnen dat ook zijn), moeten uw parameters
NVARCHAR
zijn , nietVARCHAR
. En identifiers zijn beperkt tot 128 tekens, dus er is geen reden om> 257 tekens voor@tablename
te ondersteunen . - beëindig uitspraken met puntkomma's .
- gebruik de catalogusweergaven in plaats van
INFORMATION_SCHEMA
- hoewel dit laatste is wat je professor misschien heeft geleerd en zou kunnen verwachten.
- gebruik
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
Als je tevreden bent dat het de SELECT
. uitvoert de vraag die je zoekt, reageer dan op de PRINT
en verwijder de commentaar bij de EXEC
.