- Du behöver bara söka efter kolumner som faktiskt innehåller strängar, inte alla kolumner i en tabell (som kan inkludera heltal, datum, GUID, etc).
- Du borde inte behöva en #temp-tabell (och absolut inte en ##temp-tabell) alls.
- Du måste använda dynamisk SQL (även om jag inte är säker på om detta har varit en del av din läroplan hittills).
- Jag tycker att det är fördelaktigt att följa några enkla konventioner
, som du har brutit mot:
- använd
PROCEDURE
intePROC
- det är inte en "prick", det är en "lagrad procedur." - använd
dbo.
(eller alternativt schema) prefix när du refererar till något objekt . - linda in din procedurtext i
BEGIN
/END
. - använd vokaler rikligt. Sparar du så många tangenttryckningar, strunt i tid, säg
@tblname
istället för@tablename
eller@tablename
? Jag kämpar inte för en specifik konvention men att spara karaktärer på bekostnad av läsbarhet förlorade sin charm på 70-talet. - använd inte
sp_
prefix för lagrade procedurer - detta prefix har speciell betydelse i SQL Server. Namnge proceduren för vad den gör. Det behöver inget prefix, precis som vi vet att de är tabeller även utan entbl
prefix. Om du verkligen behöver ett prefix där, använd ett annat somusp_
ellerproc_
men jag personligen tycker inte att prefixet ger dig någon information du inte redan har. - eftersom tabeller lagras med Unicode (och vissa av dina kolumner kanske också är det), bör dina parametrar vara
NVARCHAR
, inteVARCHAR
. Och identifierare är begränsade till 128 tecken, så det finns ingen anledning att stödja> 257 tecken för@tablename
. - avsluta uttalanden med semikolon .
- använd katalogvyerna istället för
INFORMATION_SCHEMA
- även om det senare är vad din professor kan ha lärt ut och kan förvänta sig.
- använd
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 är glad att den matar ut SELECT
fråga du är ute efter, kommentera PRINT
och avkommentera EXEC
.