sql >> データベース >  >> RDS >> Sqlserver

特定のテーブルの列を動的に検索する

    <オール>
  1. テーブル内のすべての列 (整数、日付、GUID などを含む場合があります) ではなく、実際に文字列を含む列のみを検索する必要があります。
  2. #temp テーブルは必要ありません (もちろん ##temp テーブルも必要ありません)。
  3. 動的 SQL を使用する必要があります (ただし、これがこれまでのカリキュラムの一部であったかどうかはわかりません)。
  4. いくつかに従うことは有益だと思います簡単な規則 、あなたが違反したすべて:
    • PROCEDURE を使用 PROC ではありません - 「prock」ではなく、「ストアド プロシージャ」です。
    • を使用 オブジェクトを参照するときの (または代替スキーマ) プレフィックス .
    • プロシージャ本体を BEGIN で囲みます /END .
    • 母音を自由に使う。 @tblname と言って、時間を気にせずに多くのキーストロークを節約できますか? @tablename の代わりに または @table_name ?私は特定の慣習のために戦っているわけではありませんが、読みやすさを犠牲にして文字を保存することは、70 年代にその魅力を失いました.
    • sp_ を使用しないでください ストアド プロシージャのプレフィックス - このプレフィックスは、SQL Server で特別な意味を持ちます。手順に名前を付けてください。 tbl がなくてもテーブルであることがわかっているように、プレフィックスは必要ありません。 プレフィックス。そこにプレフィックスが本当に必要な場合は、 usp_ のような別のものを使用してください または proc_ しかし、個人的には、プレフィックスがあなたがまだ持っていない情報を提供するとは思いません.
    • テーブルは Unicode を使用して保存されているため (一部の列もそうかもしれません)、パラメーターは NVARCHAR にする必要があります。 、 VARCHAR ではありません .また、識別子は 128 文字に制限されているため、@tablename で 257 文字を超える文字をサポートする理由はありません。 .
    • ステートメントをセミコロンで終了する .
    • INFORMATION_SCHEMA の代わりにカタログ ビューを使用する - 後者は、教授が教えて期待したことかもしれませんが。
  5. 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 のコメントを外します .



    1. Oracle CloudPlatformでのMySQLデータベースサービスでのOracleJDeveloperの使用、パート2

    2. PHP+MySQLを使用したバイナリツリー

    3. DUP_VAL_ON_INDEXをトリガーする値をキャプチャします

    4. SETフィールドに使用可能な値を取得するにはどうすればよいですか?