- Трябва да търсите само колони, които действително съдържат низове, а не всички колони в таблица (които може да включват цели числа, дати, GUID и т.н.).
- Въобще не трябва да имате нужда от #temp таблица (и със сигурност не ##temp таблица).
- Трябва да използвате динамичен SQL (макар че не съм сигурен дали това е било част от вашата учебна програма досега).
- Намирам за полезно да следвам няколко прости конвенции
, всички от които сте нарушили:
- използвайте
PROCEDURE
неPROC
- това не е "прок", това е "съхранена процедура." - използвайте
dbo.
(или алтернативна схема) префикс при препратка към който и да е обект . - обвийте тялото на вашата процедура в
BEGIN
/END
. - използвайте щедро гласни. Спестявате ли толкова много натискания на клавиши, без значение време, казвайки
@tblname
вместо@tablename
или@table_name
? Не се боря за конкретна конвенция, но спестяването на знаци за сметка на четливостта загуби своя чар през 70-те години. - не използвайте
sp_
префикс за съхранени процедури - този префикс има специално значение в SQL Server. Назовете процедурата за това, което прави. Не се нуждае от префикс, точно както знаем, че са таблици дори безtbl
префикс. Ако наистина имате нужда от префикс там, използвайте друг катоusp_
илиproc_
но аз лично не смятам, че този префикс ви дава информация, която вече нямате. - тъй като таблиците се съхраняват с помощта на Unicode (и някои от вашите колони също може да бъдат), вашите параметри трябва да бъдат
NVARCHAR
, а неVARCHAR
. И идентификаторите са ограничени до 128 знака, така че няма причина да се поддържат> 257 знака за@tablename
. - завършване на изрази с точка и запетая .
- използвайте изгледите на каталога вместо
INFORMATION_SCHEMA
- въпреки че последното е това, което вашият професор може да е преподавал и може да очаква.
- използвайте
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
Когато сте доволни, че извежда SELECT
заявка, която преследвате, коментирайте PRINT
и разкоментирайте EXEC
.