2017-10-10 5 views
0

レコードの数をカウントするストアドプロシージャがあります。動的クエリよりもテーブル変数を使用するその他のメソッド

CREATE PROCEDURE spCountAnyTableRows 
    (@PassedTableName as NVarchar(255)) 
AS 
    -- Counts the number of rows from any non-system Table, *SAFELY* 
BEGIN 
    DECLARE @ActualTableName AS NVarchar(255) 

    SELECT @ActualTableName = QUOTENAME(TABLE_NAME) 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME = @PassedTableName 

    DECLARE @sql AS NVARCHAR(MAX) 
    SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';' 

    EXEC(@SQL) 
END 

は今、私は上記で定義され@sqlで単純なクエリを置き換えるために、より複雑なクエリを使用したい、と私は参加する多くがあるので、私のクエリでテーブルの別名を使用する必要があります。動的クエリでテーブルエイリアスを使用する方法はありません。

私の質問:テーブルエイリアスを使用する方法がある場合、ストアドプロシージャでテーブル変数を使用する他の方法はありますか?

+0

あなたはあまりにも遠くに行く前に...何のためにこれはウェブに直面した場合は、停止して、適切にパラメータにSQLインジェクション&どのように学びますあなたの動的SQL。あなたが書いたとおりに、あなたは座っているアヒルです。 –

+0

いいえ、内部のみで使用してください。簡単にするため、0のセキュリティ要件を想定しましょう。 –

+0

そう...コード化するのは簡単にできるはずです。問題は、実際にそれを使用することをどのように計画しているかです。選択リストを使用できるようにする、またはスキーマの信頼できる部分を暗記するようなインターフェースを設定していますか?いずれの場合も、INFORMATION_SCHEMAビューを忘れてしまいます。データベース、スキーマ、表から表への取得を容易にするIDを公開するsys.scemaビューが必要です。 –

答えて

0

ダイナミックsqlでエイリアス名を使用する場合、エイリアス名を使用して各テーブル名変数を割り当ててください。

SELECT @ActualTableName = QUOTENAME(TABLE_NAME) + ' as a' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME = @PassedTableName 

同じクエリに含まれるテーブルに一意のエイリアス名を指定してください。

あるいは動的なクエリの内部であなたが提供できる別名

SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ' as a ;' 
0
/* This Script is use to Fetch To count the Numbers of rows in Table */ 
CREATE TABLE #rowcount (tablename VARCHAR(128), cnt INT) 
EXEC sp_MSforeachtable 
@command1 = 'Insert into #rowcount select ''?'', 
       count(*) from ?', 
@whereand = 'and o.name = ''Table_Name''', -- Table_Name 
@postcommand = 'SELECT * from #rowcount Where Cnt >0 Order by tablename' 

DROP TABLE #rowcount 

OR YOU Can Get All Table Row Count by removing Where clause 

CREATE TABLE #rowcount (tablename VARCHAR(128), cnt INT) 
EXEC sp_MSforeachtable 
@command1 = 'Insert into #rowcount select ''?'', 
       count(*) from ?', 
@postcommand = 'SELECT * from #rowcount Where Cnt >0 Order by tablename' 

DROP TABLE #rowcount 
関連する問題