Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cari kolom secara dinamis untuk tabel yang diberikan

  1. Anda hanya perlu mencari kolom yang benar-benar berisi string, tidak semua kolom dalam tabel (yang mungkin termasuk bilangan bulat, tanggal, GUID, dll).
  2. Anda seharusnya tidak memerlukan tabel #temp (dan tentu saja bukan tabel ##temp) sama sekali.
  3. Anda perlu menggunakan SQL dinamis (meskipun saya tidak yakin apakah ini telah menjadi bagian dari kurikulum Anda sejauh ini).
  4. Saya merasa bermanfaat untuk mengikuti beberapa konvensi sederhana , yang semuanya telah kamu langgar:
    • gunakan PROCEDURE bukan PROC - ini bukan "prock", ini adalah "prosedur tersimpan".
    • gunakan dbo. (atau skema alternatif) awalan saat mereferensikan objek apa pun .
    • bungkus badan prosedur Anda dalam BEGIN /END .
    • gunakan vokal secara bebas. Apakah Anda menyimpan banyak penekanan tombol, apalagi waktu, mengatakan @tblname bukannya @tablename atau @table_name ? Saya tidak memperjuangkan konvensi tertentu, tetapi menyimpan karakter dengan mengorbankan keterbacaan kehilangan pesonanya di tahun 70-an.
    • jangan gunakan sp_ awalan untuk prosedur tersimpan - awalan ini memiliki arti khusus dalam SQL Server. Sebutkan prosedur untuk apa yang dilakukannya. Itu tidak memerlukan awalan, sama seperti kita tahu bahwa itu adalah tabel bahkan tanpa tbl awalan. Jika Anda benar-benar membutuhkan awalan di sana, gunakan yang lain seperti usp_ atau proc_ tapi saya pribadi tidak merasa bahwa awalan memberi Anda informasi apa pun yang belum Anda miliki.
    • karena tabel disimpan menggunakan Unicode (dan beberapa kolom Anda mungkin juga demikian), parameter Anda harus NVARCHAR , bukan VARCHAR . Dan pengenal dibatasi 128 karakter, jadi tidak ada alasan untuk mendukung> 257 karakter untuk @tablename .
    • akhiri pernyataan dengan titik koma .
    • gunakan tampilan katalog alih-alih INFORMATION_SCHEMA - meskipun yang terakhir adalah apa yang mungkin telah diajarkan dan diharapkan oleh profesor Anda.
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

Saat Anda senang bahwa itu mengeluarkan SELECT kueri yang Anda cari, beri komentar PRINT dan batalkan komentar EXEC .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server:Bagaimana cara mengambil data dari beberapa tabel dinamis?

  2. Kerangka Entitas dan (1 ke banyak)-(banyak ke 1) (1 - * * - 1) relasi

  3. Apakah ada cara untuk menonaktifkan pemicu SQL Server hanya untuk lingkup eksekusi tertentu?

  4. Memotong semua tabel dalam Database di SQL Server - Tutorial SQL Server / TSQL Bagian 55

  5. pyodbc tidak dapat terhubung ke database