动态创建键值对然后......然后

时间:2017-03-10 22:56:01

标签: c# sql sql-server asp.net-mvc-5

是否可以从HTML单选按钮和文本框值创建键值对,然后将该对插入到数组中,然后将该数组传递到SQL存储过程参数,该参数将添加到SP中的WHERE子句?

我正在构建一个仪表板应用程序,它在启动时引用SQL Server数据库中的一个表。这将返回简单选择SP的结果。我对SQL很陌生,所以我是“伪造的”(对不起)

   DECLARE @SelectedDate NVARCHAR(50)       
   SELECT * FROM Tablename WHERE log_ts > @SelectedDate

但是此时我需要能够在1-4个字段名称之间进行选择,并为它们提供一个值来过滤。

我希望将这些字段名称设置为单选按钮,并且为了防止注入,在将应用程序发送到服务器之前,将这些输入与应用程序中的已知值进行筛选,包括插入输入的默认值为null。 我的想法是在筛选完成后设置一个数组[string,string],并将该数组作为数组[field,value]传递给SQL。(永远不会有空值)。这就是我想要的数组在发送时看起来像是所有对都是默认值:

   QueryArray = ["application_name","Mobile"]
                ["login_id","*"]
                ["log_ts","Datetime.Today"]
                ["error_level","Exception"]

然后以某种方式将其传递到where子句中:

   SELECT * 
   FROM TableName
   WHERE [application_name] = [Mobile]
     AND [login_id]=[*]
     AND [log_ts]=[Datetime.Today] 
     AND [error_level]=[Exception]

这是我的大脑正常寻找for-each或者某些东西的地方,但SQL对我来说是新鲜的......任何帮助都会非常感激,即使它只是一个我之前找不到的文章的链接...

1 个答案:

答案 0 :(得分:1)

听起来您想要将可空参数与coalesce运算符结合使用。如果您有一组已知的参数,然后想要对它们进行过滤,则此方法很有效。因此,如果您知道可以搜索的所有可能字段,假设您知道您将在UI上显示哪些字段以供人们使用进行过滤,那么您实际上可以制作如下过程:

create procedure [dbo].[MySampleProcedure]
    @Property1Value <yourDataType> = null,
    @Property2Value <yourDataType> = null,
    ....
as
begin
     select
          Col1,
          Col2,
          ...
     from
         [dbo].[YourTable]
     where
         Column1Value = coalesce(@Property1Value, Column1Value)
         and Column2Value = coalesce(@Property2Value, Column2Value)
         ....
end

这实际上意味着如果省略某些参数,您仍然可以根据您提供的参数进行匹配。当您从用户界面收到集合时,您可以将这些对与参数进行匹配,然后您就可以参加比赛了。

如果你的字段名称是动态的(提前不知道),那么它就成了一个更难的问题。在这种情况下,您可能必须使用动态SQL来完成所需的操作,并使用参数化SQL构造查询,以避免注入尝试。