繁体   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