2012-02-10 4 views
3

データベースに非常によく似た2つのテーブルがあり、Visual Studio 2010 Webアプリケーション用のストアドプロシージャを作成して、テーブル番号のあるテーブルからデータを読み込む必要があります。SQL Serverで渡されたパラメータからテーブル名と列名を選択するにはどうすればよいですか?

現在のところ、私たちは2つのテーブルしか選択できませんが、私はこのプロジェクトが成長するにつれて、これ以上の成長を見て取ることができます。

これは私が何をしようとしています何の一種ですが、このコードが正しくありません:

PROCEDURE [dbo].[spGetData] 
    @tableID int 
AS 
BEGIN 
SET NOCOUNT ON; 
    declare @col1 nvarchar(50), @table nvarchar(50) 
    set @col1=case when @tableID=1 then 'SMRequestID' else 'WHRequestID' end 
    set @table=case when @tableID=1 then 'SMRequest' else 'WHRequest' end 

    select @col1 as 'Request', WorkOrder, PartNumber, Qty, EmployeeID 
    from @table 
END 

基本的には、ColumnNameTableNameが渡されます@tableIDパラメータに依存

。それをどうやってやりますか?

注:私の検索では関連するものは見当たりませんが、私はC#開発者でデータベース開発者ではありません。私はこれが前に尋ねられたと想像します、それはちょうど私が適切なキーワードを使用していないです。

+1

テーブルやカラム名の場合動的SQLを使用する必要があります。 – Yuck

答えて

2

1つのオプションは、IDに基づいて、条件を使用して、テーブルの各セクションでは、特定のテーブルのためのコードを配置することです。

私は動的SQLから離れ、プリコンパイルによってスピードの理由でデータベースサーバが最適化するための戦闘機会を得ることができます。

注:データベースサーバーは、一般的に文字列操作(動的SQLの作成)ではかなり悪いです。

EDIT1:インスタンスの例

:THIS SQL

declare @mytest varchar(5) 
set @mytest = 'PROCS' 

IF @mytest = 'PROCS' 
BEGIN /* STORED PROCS */ 
    SELECT DISTINCT 
    o.name AS ObjectName_StoredProcedure 
    FROM sysobjects as o 
    WHERE o.xtype = 'P' 
END 
ELSE 
IF @mytest = 'DEFAULT' 
BEGIN 
    SELECT DISTINCT 
    o.name AS ObjectName_StoredProcedure 
    FROM sysobjects as o 
    WHERE o.xtype = 'D' 
END 

はあなたがパラメータに渡すものに応じて店舗のプロシージャ名またはデフォルトの制約を与えます。

EDIT2:OPコードに基づいて:

CREATE PROCEDURE [dbo].[spGetData] 
    (@tableID int ) 
    AS 
    BEGIN 
    SET NOCOUNT ON; 
    IF @tableID = 1 
    BEGIN 
     SELECT SMSRequestId AS 'Request', 
      WorkOrder, PartNumber, Qty, EmployeeID 
     FROM SMRequest 
    END 
    IF @tableID = 2 
    BEGIN 
     SELECT WHRequestID AS 'Request', 
      WorkOrder, PartNumber, Qty, EmployeeID 
     FROM WHRequest 
    END 
END 
+0

私を許して、マーク。私はこの条件が何であるか、それをどのように使うのか分かりません。 – jp2code

+0

あなたの編集を見た後、これはまさに私がやろうとしていたものです。ありがとう! – jp2code

1

は、動的SQLでそれを実行します。

PROCEDURE [dbo].[spGetData] 
    @tableID int 
AS 
BEGIN 
SET NOCOUNT ON; 
    declare @col1 nvarchar(50), @table nvarchar(50), @cmd nvarchar(400) 
    set @col1=case when @tableID=1 then 'SMRequestID' else 'WHRequestID' end 
    set @table=case when @tableID=1 then 'SMRequest' else 'WHRequest' end 


    @cmd = "select " + @col1 + " as 'Request', WorkOrder, PartNumber, Qty, EmployeeID from " + @table 

    EXEC(@cmd) 

END 
+0

甘い!どうもありがとうございました。 Yuckはそれについて何か言ったが、私はそれを使う方法を見つけるためにチュートリアルに従わなければならなかった。 – jp2code

+0

@ jp2code問題はありません:) –

+0

これは動作しますが、sp_executesqlは動的SQLを実行するための優先メソッドです。条件付きロジックを使用したくない場合は、上記のRonの答えが最良の方法です。 –

3

私はマークがテーブルやクエリを簡単にする少数の特定は非常に正しいと思いますが、ここでは、テーブルと列の両方に合格し、動的SQLの例はあります名前:

CREATE PROCEDURE spGetData 
(
@TableName nvarchar(128), 
@ColumnName nvarchar(128) 
) 
AS 
    BEGIN 
    SET NOCOUNT ON; 
    DECLARE @SQL nvarchar(4000) 
    SET @SQL = 'SELECT ' + @ColumnName + ', as Request, WorkOrder, PartNumber, Qty, EmployeeID FROM ' + @TableName 
    EXEC sp_executesql @SQL 
    END 

次のようにあなたはそれを呼び出すことができます。

exec spGetData 'SMRequest', 'SMRequestID' 
exec spGetData 'WHRequest', 'WHRequestID' 
関連する問題