2016-06-14 11 views
0

動的なカウント関数を実行しようとしています。ここでは、テーブル名と列名、およびcountの基準の列名を渡します。ここには何がありますか?作成しよう:動的カウント関数SQL Server 2012

USE [testdb1] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
Create FUNCTION [dbo].[ItemCount](
@TableName [varchar](255), 
@PKIDName [varchar](255), 
@IDValue Integer, 
@ColumnName [varchar](255), 
@ColumnValue [varchar](255) 
) 
RETURNS [varchar](100) AS 
BEGIN 
     DECLARE @Result integer 

     select @Result =count(*) 
     from @TableName where @PKIDName = @IDValue and @ColumnName = @ColumnValue 

     RETURN @Result 
END 

も可能な場合と同様に(上記の例では、例えば=)比較演算子を通過することができるであろうよう<>または>として。

ありがとうございました

+2

テーブル名に変数を使用することはできません。動的SQLを使用する必要があります。 –

+2

Danが言ったこと - ここでも列名にも同じことが言えます。 – Bridge

+0

Dynamic Sqlがユーザー定義関数で使用できるかどうかわかりません。また、あなたの関数を 'returns varchar(100)'と宣言していますが、 'integer'を返します。これは有効なSQLサーバのデータ型でもなく、' int'でなければなりません。 –

答えて

0

これはストアドプロシージャに適していると思います。 SET @SQLStatementでは、 "="を変数に更新し、新しい変数を使用して比較演算子を更新することもできます。注@IDValueは連結の目的でvarcharに設定されているため、引用符を付ける必要があります(つまり '1')。しかし、文字列は、スクリプトが実行されるときに整数であると読み取られます。

CREATE PROCEDURE dbo.ItemCount 
(
@TableName [varchar](255), 
@PKIDName [varchar](255), 
@IDValue [varchar](255), 
@ColumnName [varchar](255), 
@ColumnValue [varchar](255) 
) 
AS 

BEGIN 

DECLARE @SQLStatment VARCHAR(MAX); 

SET @SQLStatment = 'SELECT COUNT(*) [RowCount] FROM ' + @TableName + ' WHERE ' + @PKIDName + ' = ' + @IDValue + ' AND ' + @ColumnName + ' = ' + CHAR(39) + @ColumnValue + CHAR(39); 

EXECUTE(@SQLStatment) 

END 

ストアドプロシージャに慣れていない場合は、適切な値を挿入するだけで次のようにプロシージャを実行できます。

EXEC dbo.ItemCount @TableName, @PKIDName, @IDValue, @ColumnName, @ColumnValue; 
関連する問題