在 FROM 子句中带有参数的存储过程中使用 LIKE 和 %

2023-11-30

我正在创建一个网页来托管数据库。

我希望此网页具有搜索框功能,可以为 SSMS 2014 中的表更新 Visual Studio 2017 中的 GridView。

我希望这个 GridView 是动态的,因为最终用户可以选择一个表、一个列,然后指定一个“searchString”来应用于该列中的数据。

网页如下所示:

继续看代码。

在搜索按钮单击事件中,我希望将三个文本框中每个文本框中的值传递到存储过程中。

这是按钮单击事件的当前代码。

protected void btnSearch_Click(object sender, EventArgs e)
{
    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["CID1ConnectionString"].ConnectionString))
    {
        SqlDataAdapter searchAdapter = new SqlDataAdapter("Search", con);
        searchAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
        searchAdapter.SelectCommand.Parameters.AddWithValue("@TableName", TableSearchBox.Text.Trim());   // passing text in first text box in
        searchAdapter.SelectCommand.Parameters.AddWithValue("@columnSpecifier", ColumnSearchBox.Text.Trim());   // passing text in second text box in
        searchAdapter.SelectCommand.Parameters.AddWithValue("@searchString", searchStringBox.Text.Trim());   // passing text in third text box in

        DataTable temptable = new DataTable(); //table to have data that satisfies searchString copied to
        searchAdapter.Fill(temptable); //filling table from adapter

        tableDisplay.DataSource = temptable;
        //tableDisplay.Columns[0].Visible = false;
        tableDisplay.DataBind();//bind step
    }
}

这是我当前的存储过程:

ALTER PROCEDURE dbo.Search 
    (@tableName NVARCHAR(50),
     @columnSpecifier NVARCHAR(50),
     @searchString NVARCHAR(50)) 
AS 
     EXEC('SELECT * FROM ' + @tableName + ' WHERE ' + @columnSpecifier + ' LIKE '' + @searchString + %''')

如果最终用户用“Basic_Info”填充第一个文本框,用“Name”填充第二个文本框,用“M”填充最后一个文本框,则应该实现与此类似的查询。

SELECT Name 
FROM Basic_Info 
WHERE Name LIKE 'M%'

看来是因为我在中使用动态表名称FROM子句我需要使用动态SQL。我已将查询放入EXEC块并用单引号 (') 包围我的 SQL 语法。这些单引号似乎使我在我的LIKE条款不可能,但也许我只是没有看到它。

有没有办法实现这个功能?我应该备份并以其他方式执行此操作吗?我读到这可能会导致 SQL 注入,这听起来像是应该避免的事情。任何关于这篇文章及其格式的建议都值得赞赏。这是我关于堆栈溢出的第一个问题!

编辑:事实证明存储过程和参数的使用是不必要的。我的最终按钮单击事件如下所示,只是获取文本框文本值来填写查询。

        protected void btnSearch_Click(object sender, EventArgs e)
    {
            using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["CID1ConnectionString"].ConnectionString))
            {
            DataTable temptable = new DataTable(); //table to have data that satisfies searchString copied to
            SqlDataAdapter searchAdapter = new SqlDataAdapter("SELECT * FROM " + TableSearchBox.Text.Trim() + " WHERE " + ColumnSearchBox.Text.Trim() + " LIKE '"  + searchStringBox.Text.Trim() + "%'", con);
            searchAdapter.Fill(temptable); //filling table from adapter
            tableDisplay.DataSource = temptable;
            tableDisplay.DataBind();//bind step
            }
    }

这是一个参数化动态 SQL 示例,使用QUOTENAME对于标识符:

CREATE PROCEDURE dbo.Search
    @tableName sysname,
    @columnSpecifier sysname,
    @searchString nvarchar(50)
AS
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT * FROM ' + QUOTENAME(@tableName) + N' WHERE ' + QUOTENAME(@columnSpecifier) + N' LIKE @searchString + ''%'';';
EXEC sp_executesql
      @SQL
    , N'@searchString nvarchar(50)'
    , @searchString = @searchString;
GO

我一般推荐一个避免添加值因为它从提供的 .NET 类型推断 SQL 数据库类型。尽管这不是一个问题,因为您正在使用存储过程并且 System.String 映射到 SQL Servernvarchar,最好明确指定所需的 SqlDbType 和长度(或精度和小数位数)。下面是一种方法。

searchAdapter.SelectCommand.Parameters.Add("@TableName", SqlDbType.NVarChar, 128).Value = TableSearchBox.Text.Trim());   // passing text in first text box in
searchAdapter.SelectCommand.Parameters.Add("@columnSpecifier", SqlDbType.NVarChar, 128).Value = ColumnSearchBox.Text.Trim());   // passing text in second text box in
searchAdapter.SelectCommand.Parameters.Add("@searchString", SqlDbType.NVarChar, 50).Value = searchStringBox.Text.Trim());   // passing text in third text box in
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 FROM 子句中带有参数的存储过程中使用 LIKE 和 % 的相关文章

随机推荐

  • 检测 Android 应用程序何时进入后台

    在我的应用程序中 我需要检测我的应用程序是要进入后台还是要切换到同一应用程序的另一个活动 我知道我必须使用 onPause 方法 但是我如何区分这两种情况 private static boolean isApplicationGoingT
  • 将值附加到列表中的每个子列表

    我有一个列表列表 我想将一个常量值附加到完整列表的每个子列表 例如 lst 1 2 3 4 5 6 我想附加7到每个子列表 以便 lst变成 1 2 7 3 4 7 5 6 7 有没有好的方法来完成工作 例如使用zip 谢谢 for l i
  • 从 SQL Server 到外部应用程序的消息 (activemq)

    我的系统中安装了 SQL Server 数据库和 Activemq 我尝试创建端点来监听 activemq 所在的端口 端口是61617 CREATE ENDPOINT InstInitiatorEndpoint STATE STARTED
  • Android 清单使用权限与 Android 设备规格

    有什么方法可以检查原因吗我的安卓应用程序不显示在Play Store在某些设备上 例如Samsung Galaxy S Duos Samsung Ace Plus and Micromax A110ETC 虽然我可以通过安装我的应用程序US
  • 使用 Directory.Getfiles 并指定绝对路径

    嗨 我想知道你们是否可以帮忙 我正在编写一个应用程序 该应用程序将运行在多个服务器上 因此有多个 IP 我不想使用确切的 IP 和目录结构 而是想从应用程序实际运行的位置 后退 一个文件夹 那么例如 文件夹结构是 controls 这包含
  • 字符串到字符串的压缩算法?

    我正在寻找一种算法 可以将一些字符串压缩为另一个字符串 即没有 0 或特殊控制字符 但我在互联网上找不到任何内容 有这样的算法吗 它不必特别高效 只需一些基本的东西即可 Easy echo Hello world gzip c base64
  • 使用 COUNT(DISTINCT ...) 时出现 BigQuery 错误“响应太大而无法返回”

    我有一个大约 20M 行的数据集 我正在观察以下行为 下面的查询返回错误 响应太大而无法返回 id 字段在多个记录之间共享 field 字段对于每个记录都有一些任意值 我预计结果集应该只包含 10 行 远低于查询响应限制 SELECT id
  • 在具有相似名称的多个数据帧上使用 rbind() 的优雅方法?

    目前 我有多个同名且按运行顺序排列的数据帧 foo1 foo2 foo3 foo4 foo5 ETC 我正在尝试创建一个包含上述数据帧的所有行的大型数据帧rbind 有没有一种优雅的方法来做到这一点 这相当于rbind foo1 foo2
  • 如何在Python中获取文件中的字节偏移量

    我正在使用 hadoop 和 python 制作倒排索引 我想知道如何在 python 中包含行 字的字节偏移量 我需要这样的东西 hello hello txt 1124 我需要制作完整倒排索引的位置 请帮忙 像这样 file tell
  • 动态加载 less.js 规则

    我正在考虑使用less js 看起来很棒 但我们的网站要求在初始页面加载后动态加载某些样式 然而 似乎所有 LESS 样式表都必须在 less js 脚本加载之前加载 即这有效 但如果交换行就会失败 Firefox 和 chrome 似乎都
  • 如何使用python计算地球表面多边形的面积?

    标题基本上说明了一切 我需要使用 Python 计算地球表面多边形内的面积 计算地球表面任意多边形包围的面积对此说了一些话 但对技术细节仍然含糊其辞 如果你想用更多的方法来做到这一点 GIS 风味 那么你需要选择 您所在地区的计量单位以及
  • Azure 自定义脚本扩展。以另一个用户身份执行脚本

    我使用 command1 ps1 脚本在目标 VM 上安装 Azure 自定义脚本扩展并执行 command2 ps1 command2 ps1 应该以域管理员身份运行脚本 位于 ScriptBlock 内 因此 Credential Cr
  • 禁用特定月份 JqueryUI datepicker

    我正在创建一个包含 jQuery UI Datepicker 的预订表单 现在我有一个需要帮助的主要问题 有些旅行只有特定日期有效 并且只能在特定月份出售 因为例如旋风季节 禁用特定工作日的功能非常完美 但我不确定如何停用完整的月份 例如十
  • 为什么“git分支”在新存储库中保持沉默?

    当您创建新存储库并运行git branch 它默默地退出 例如 mkdir tmp foo cd tmp foo git init Initialized empty Git repository in tmp foo git git br
  • 对可能不包含协议的字符串运行 parse_url()

    我正在尝试从用户输入的 URL 字符串中获取域名和 TLD 无子域 该字符串可能有也可能没有协议 目录 子域 文件名等 换句话说 考虑到以下任一情况 example com www example com sub example com e
  • GDI 渲染到 direct2D ID2D1BitmapRenderTarget 始终是透明的

    我想将我的电影渲染软件从 DirectDraw 移植到 Direct2D 由于兼容性问题 GDI 渲染需要在图像之上完成 为了优化性能我想实现某种后备缓冲机制 但是alpha通道信息似乎有问题 所有 GDI 绘图都显得透明 我创建一个ID2
  • 根据产品类别拒绝在 Woocommerce 中结帐特定购物车商品

    基于仅当购物车中有强制类别的产品时才允许结帐我尝试制作自己的代码示例 如果购物车出现 则呈现通知并阻止结账 仅包含特定类别的产品 它可以预防和错误通知 但在添加其他产品时 它仍然拒绝结帐 Renders a notice and preve
  • 字符编码检测算法

    我正在寻找一种检测文档中字符集的方法 我一直在这里阅读 Mozilla 字符集检测实现 通用字符集检测 我还找到了一个名为 jCharDet 的 Java 实现 JCharDet 这两者都是基于使用一组静态数据进行的研究 我想知道是否有人成
  • 使用 onAuthStateChanged 的​​ Firebase 切换标头选项

    如果我的问题已经提出 我很抱歉 我是 React 的初学者 我真的很想学习如何做到这一点并理解 我在 React JS 项目上使用 Firebase 并且希望在用户连接或未连接时切换标头的一部分 我认为使用条件渲染但在 if 之后的 fir
  • 在 FROM 子句中带有参数的存储过程中使用 LIKE 和 %

    我正在创建一个网页来托管数据库 我希望此网页具有搜索框功能 可以为 SSMS 2014 中的表更新 Visual Studio 2017 中的 GridView 我希望这个 GridView 是动态的 因为最终用户可以选择一个表 一个列 然