簡體   English   中英

如何從SQL Server中傳遞的參數中選擇表和列名?

[英]How to select Table and Column Names from passed parameters in SQL Server?

我的數據庫中有兩個非常相似的表,我需要為Visual Studio 2010 Web應用程序編寫一個存儲過程,以便在給定表號的情況下從其中一個表中讀取數據。

目前,我們只有兩個表可供選擇,但隨着這個項目的增長,我可以看到這種情況越來越多。

這是我想要做的,但這段代碼不正確:

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#開發人員,而不是數據庫開發人員。 我想以前曾經問過,只是我沒有使用正確的關鍵字。

雖然我認為Mark是完全正確的,因為少量的表和查詢的簡單性,這里是一個動態的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'

一種選擇是使用基於ID的條件,並將表中的特定表的代碼放在表的每個部分中。

我更喜歡這種方法來擺脫動態sql並允許數據庫服務器通過預編譯獲得優化速度的優勢。

注意:數據庫服務器通常在字符串操作(創建動態sql)方面非常糟糕。

編輯1:示例

FOR INSTANCE:這個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

使用動態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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM