sql中的存储过程,用于根据输入值选择列

时间:2015-12-18 14:17:53

标签: sql-server

我正在尝试在SQL中编写执行以下操作的存储过程

  1. 接受2个输入(BatchType和"列名称")。
  2. 搜索数据库并在列="列名称"
  3. 中提供批次日期和数据

    代码如下:

    ALTER PROCEDURE [dbo].[chartmilldata] 
        -- Add the parameters for the stored procedure here
        (@BatchType nvarchar (50),
         @Data nvarchar(50))
    AS
    BEGIN
    
        -- Insert statements for procedure here
        SELECT BatchDate,@Data FROM --Database-- WHERE BatchType = @BatchType 
    
    END
    

    我正在尝试根据操作员输入从数据库中选择列。但我没有得到输出。如果有人可以给我一个方向,那就太好了。

2 个答案:

答案 0 :(得分:0)

您可能希望将SELECT语句构建为字符串,然后使用sp_executesql执行它。

有关详细信息,请参阅此页面: https://msdn.microsoft.com/en-us/library/ms188001.aspx

这将允许您通过变量将查询设置为替换列名,然后执行语句。务必确保您的输入消毒!

答案 1 :(得分:0)

你需要使用动态SQL, HOWEVER 我不推荐这个解决方案,我不认为我可以添加任何内容,为什么我不推荐它不是'在The Curse and Blessings of Dynamic SQL中,在Erland Sommarskog中解释得更好。

尽管如此,如果 在存储过程中执行此操作,您可以使用以下内容:

FrameLayout toggleView = (FrameLayout) v;
        toggleView.bringToFront();
        toggleView.requestLayout();
        toggleView.invalidate();

最好将输入参数ALTER PROCEDURE [dbo].[chartmilldata] -- Add the parameters for the stored procedure here (@BatchType nvarchar (50), @Data nvarchar(50)) AS BEGIN -- DECLARE AND SET SQL TO EXECUTE DECLARE @SQL NVARCHAR(MAX) = N'SELECT BatchDate = NULL, ' + QUOTENAME(@Data) + N' = NULL;'; -- CHECK COLUMN IS VALID IN THE TABLE IF EXISTS ( SELECT 1 FROM sys.columns WHERE name = @Data AND object_id = OBJECT_ID('dbo.YourTable', 'U') ) BEGIN SET @SQL = 'SELECT BatchDate, ' + QUOTENAME(@Data) + ' FROM dbo.YourTable WHERE BatchType = @BatchType;'; END EXECUTE sp_executesql @SQL, N'@BatchType NVARCHAR(50)', @BatchType; END 更改为@Data(或别名NVARCHAR(128)),因为这是列名的最大值。