- Sie müssen nur Spalten durchsuchen, die tatsächlich Zeichenfolgen enthalten, nicht alle Spalten in einer Tabelle (die ganze Zahlen, Datumsangaben, GUIDs usw. enthalten können).
- Du solltest überhaupt keine #temp-Tabelle (und schon gar keine ##temp-Tabelle) brauchen.
- Sie müssen dynamisches SQL verwenden (obwohl ich nicht sicher bin, ob dies bisher Teil Ihres Lehrplans war).
- Ich finde es vorteilhaft, ein paar zu befolgen einfache Konventionen
, gegen die Sie alle verstoßen haben:
- benutze
PROCEDURE
nichtPROC
- es ist kein "prock", es ist eine "gespeicherte Prozedur". - verwenden Sie
dbo.
(oder alternatives Schema) Präfix, wenn auf ein beliebiges Objekt verwiesen wird . - verpacken Sie Ihren Prozedurrumpf in
BEGIN
/END
. - Verwenden Sie Vokale großzügig. Sparen Sie so viele Tastenanschläge, ganz zu schweigen von der Zeit, wenn Sie
@tblname
sagen statt@tablename
oder@table_name
? Ich kämpfe nicht für eine bestimmte Konvention, aber das Sparen von Zeichen auf Kosten der Lesbarkeit hat in den 70er Jahren seinen Reiz verloren. - verwenden Sie nicht den
sp_
Präfix für gespeicherte Prozeduren – dieses Präfix hat in SQL Server eine besondere Bedeutung. Benennen Sie das Verfahren für das, was es tut. Es braucht kein Präfix, genauso wie wir wissen, dass es sich auch ohnetbl
um Tabellen handelt Präfix. Wenn Sie dort wirklich ein Präfix benötigen, verwenden Sie ein anderes wieusp_
oderproc_
aber ich persönlich glaube nicht, dass dieses Präfix Ihnen irgendwelche Informationen gibt, die Sie nicht bereits haben. - da Tabellen mit Unicode gespeichert werden (und einige Ihrer Spalten möglicherweise auch), sollten Ihre Parameter
NVARCHAR
sein , nichtVARCHAR
. Und Bezeichner sind auf 128 Zeichen begrenzt, sodass es keinen Grund gibt,> 257 Zeichen für@tablename
zu unterstützen . - Beenden Sie Anweisungen mit Semikolons .
- Verwenden Sie die Katalogansichten anstelle von
INFORMATION_SCHEMA
- obwohl letzteres das ist, was Ihr Professor vielleicht gelehrt hat und erwarten könnte.
- benutze
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
Wenn Sie zufrieden sind, dass es den SELECT
ausgibt Abfrage, nach der Sie suchen, kommentieren Sie PRINT
aus und kommentieren Sie die EXEC
aus .