sql >> Base de Datos >  >> RDS >> Sqlserver

Buscar dinámicamente columnas para una tabla dada

  1. Solo debe buscar columnas que realmente contengan cadenas, no todas las columnas de una tabla (que pueden incluir números enteros, fechas, GUID, etc.).
  2. No debería necesitar una tabla #temp (y ciertamente no una tabla ##temp) en absoluto.
  3. Necesita usar SQL dinámico (aunque no estoy seguro de si esto ha sido parte de su plan de estudios hasta ahora).
  4. Me resulta beneficioso seguir algunos convenciones simples , todo lo cual has violado:
    • usa PROCEDURE no PROC - 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 un tbl prefijo. Si realmente necesita un prefijo allí, use otro como usp_ o proc_ 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 , no VARCHAR . 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.
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 .