- Solo debe buscar columnas que realmente contengan cadenas, no todas las columnas de una tabla (que pueden incluir números enteros, fechas, GUID, etc.).
- No debería necesitar una tabla #temp (y ciertamente no una tabla ##temp) en absoluto.
- Necesita usar SQL dinámico (aunque no estoy seguro de si esto ha sido parte de su plan de estudios hasta ahora).
- Me resulta beneficioso seguir algunos convenciones simples
, todo lo cual has violado:
- usa
PROCEDURE
noPROC
- no es un "procedimiento", es un "procedimiento almacenado". - use
dbo.
(o esquema alternativo) prefijo al hacer referencia a cualquier objeto . - envuelva el cuerpo de su procedimiento en
BEGIN
/END
. - usar las vocales liberalmente. ¿Está ahorrando tantas pulsaciones de teclas, sin importar el tiempo, diciendo
@tblname
? en lugar de@tablename
o@table_name
? No estoy luchando por una convención específica, pero guardar caracteres a costa de la legibilidad perdió su encanto en los años 70. - no use el
sp_
prefijo para procedimientos almacenados:este prefijo tiene un significado especial en SQL Server. Nombre el procedimiento por lo que hace. No necesita un prefijo, al igual que sabemos que son tablas incluso sin untbl
prefijo. Si realmente necesita un prefijo allí, use otro comousp_
oproc_
pero personalmente no creo que ese prefijo le brinde información que no tenga. - dado que las tablas se almacenan usando Unicode (y algunas de sus columnas también podrían serlo), sus parámetros deben ser
NVARCHAR
, noVARCHAR
. Y los identificadores tienen un límite de 128 caracteres, por lo que no hay motivo para admitir> 257 caracteres para@tablename
. - terminar declaraciones con punto y coma .
- use las vistas de catálogo en lugar de
INFORMATION_SCHEMA
- aunque esto último es lo que su profesor puede haber enseñado y esperar.
- usa
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
Cuando esté satisfecho de que está generando el SELECT
consulta que está buscando, comente el PRINT
y descomente el EXEC
.