- Musisz przeszukać tylko kolumny, które faktycznie zawierają ciągi, a nie wszystkie kolumny w tabeli (co może zawierać liczby całkowite, daty, identyfikatory GUID itp.).
- Nie powinieneś w ogóle potrzebować tabeli #temp (a na pewno nie tabeli ##temp).
- Musisz użyć dynamicznego SQL (choć nie jestem pewien, czy do tej pory było to częścią twojego programu nauczania).
- Uważam za korzystne przestrzeganie kilku proste konwencje
, z których wszystkie naruszyłeś:
- użyj
PROCEDURE
niePROC
- to nie jest „procedura”, to „procedura składowana”. - użyj
dbo.
(lub alternatywnego schematu) przedrostek podczas odwoływania się do dowolnego obiektu . - zawiń treść procedury w
BEGIN
/END
. - obficie używaj samogłosek. Oszczędzasz tyle naciśnięć klawiszy, nie mówiąc już o czasie, mówiąc
@tblname
? zamiast@tablename
lub@table_name
? Nie walczę o konkretną konwencję, ale ratowanie postaci kosztem czytelności straciło swój urok w latach 70. - nie używaj
sp_
prefiks dla procedur składowanych — ten prefiks ma specjalne znaczenie w SQL Server. Nazwij procedurę za to, co robi. Nie wymaga prefiksu, tak jak wiemy, że są to tabele, nawet beztbl
prefiks. Jeśli naprawdę potrzebujesz tam prefiksu, użyj innego, takiego jakusp_
lubproc_
ale osobiście nie uważam, że ten prefiks zawiera jakiekolwiek informacje, których jeszcze nie masz. - ponieważ tabele są przechowywane przy użyciu Unicode (a niektóre z Twoich kolumn też mogą być), Twoje parametry powinny mieć postać
NVARCHAR
, a nieVARCHAR
. A identyfikatory są ograniczone do 128 znaków, więc nie ma powodu, aby obsługiwać> 257 znaków dla@table_name
. - zakończ wypowiedzi średnikami .
- użyj widoków katalogu zamiast
INFORMATION_SCHEMA
- chociaż to drugie jest tym, czego twój profesor mógł uczyć i może się spodziewać.
- użyj
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
Kiedy jesteś zadowolony, że wysyła SELECT
zapytanie, którego szukasz, skomentuj PRINT
i odkomentuj EXEC
.