sp_executesql 与 'IN' 语句

2024-01-11

我试图使用 sp_executesql 来防止 SQL 2005 中的 SQL 注入,我有一个像这样的简单查询:

SELECT * from table WHERE RegionCode in ('X101', 'B202')

但是,当我使用 sp_executesql 执行以下命令时,它不会返回任何内容。

Set @Cmd = N'SELECT * FROM table WHERE RegionCode in (@P1)'
SET @ParamDefinition = N'@P1 varchar(100)';
DECLARE @Code as nvarchar(100);
SET @Code = 'X101,B202'
EXECUTE sp_executesql @Cmd, @ParamDefinition, @P1 = @Code

这是我测试过的:

SET @Code = 'X101'   <-- This works, it returns a single region
SET @Code = 'X101,B202'   <--- Returns nothing
SET @Code = '''X101'',''B202'''  <-- Returns nothing

请帮助...我做错了什么?


它不起作用的原因是因为 @P1 被视为一个单一值。

例如当 @Code 为 X101,B202 时,查询将按以下方式运行: SELECT * FROM 表 WHERE RegionCode IN ('X101,B202') 因此,它正在寻找具有 @P1 包含的值的 RegionCode。即使包含单引号,这也意味着它在 RegionCode 中搜索的值应该包含这些单引号。

您需要实际将 @Code 变量连接到 @Cmd sql 命令文本中,以便它按照您的想法工作:

SET @Code = '''X101'',''B202'''
SET @Cmd = 'SELECT * FROM Table WHERE RegionCode IN (' + @Code + ')'
EXECUTE (@Cmd)

但显然,这只会让您面临 SQL 注入,因此如果您采用这种方法,则需要非常小心,以确保防范这种情况。

如果您想要传递要搜索的动态值列表,则可以使用其他方法来处理这种情况。

查看示例my blog http://www.adathedev.co.uk/2010/02/sql-server-2008-table-valued-parameters.html有两种方法可以与 SQL Server 2005 一起使用。一种方法涉及以“Value1,Value2,Value3”的形式传入 CSV 列表,然后使用用户定义的函数将其拆分为 TABLE 变量(有很多提及此方法)如果您快速谷歌或搜索此网站,则可以使用这种方法)。拆分后,您可以将该 TABLE var 加入到您的主查询中。第二种方法是传入包含值的 XML blob 并使用 SQL Server 的内置 XML 功能。这两种方法都通过该链接中的性能指标进行了演示,并且它们不需要动态 SQL。

如果您使用的是 SQL Server 2008,则表值参数将是最佳选择 - 这是我在该链接中演示的第三种方法,效果最好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sp_executesql 与 'IN' 语句 的相关文章

随机推荐

  • 无法更改应用程序中操作栏的颜色[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 https drive google com file d 1fniw1q9lx2U8D5CblZHAdBrOl2Oai
  • CORS - 何时返回“Access-Control-Expose-Headers”

    应该Access Control Expose Headers标头字段与实体一起返回以响应 实际 请求 或者它应该只在响应 CORS 预检请求时返回 Or both 该流程图是一个很好的资源 我想在我自己的答案中将其重新发布到此处 图片来自
  • SSIS SFTP:如何解决“无法上传:套接字读取操作已超时”?

    Using SSIS SFTP 扩展 http ssisextensions codeplex com 并正确配置一切 但是 每次执行 SFTP 任务时都会收到以下错误 错误 错误 无法上传 套接字读取操作已超时 在SSIS Extensi
  • R:如何在具有自由范围轴的facet_grid上使用coord_cartesian

    考虑一些facet grid plot mt lt ggplot mtcars aes mpg wt colour factor cyl geom point mt facet grid vs am scales free 想象一下我只想放
  • 干预 imagick 在终端中有效,但在浏览器中无效

    我完全不明白出了什么问题 我已经按照指导安装了干预here http image intervention io 然后我创建了以下 php 文件并启动了我的 localhost Apache 服务器并测试了结果 它成功了 这是代码 test
  • 如何安装更新的 MSBuild 版本?

    我正在尝试从源代码构建 Microsoft AspnetCore Identity 说明在这里 https github com dotnet aspnetcore blob master docs BuildFromSource md h
  • 材质设计 - 操作栏标题和内容的左边距不匹配

    我正在尝试按照以下准则设置屏幕边距布局 指标和关键线 https www google com design spec layout metrics keylines html 具体来说 移动屏幕上的列表内容应具有 72 dp 的边距 并与
  • 替换java中的字符序列

    我正在解析一个结构不良的 rss feed 并且返回的一些数据已 p at在里面 我怎样才能替换所有实例 p p at有一个空格 使用java 我很熟悉 replaceString 类的方法 但我不确定正则表达式的外观 我试过inputSt
  • 实施 Rijndael 解密时是否可以不使用 IV?

    我正在使用 Rijndael 算法实现密文解密 不幸的是 我无法访问数据的加密 并且只提供了密码 用于生成密钥 和算法类型 我没有盐 看起来没问题 也没有静脉注射 现在 我的问题是我是否绝对必须拥有 IV 才能执行解密 我怀疑编写加密的开发
  • 从字符串java中提取日期

    我有一个包含多个日期的字符串 例如 20 Jul 2012 5 11 36 670 UTC PM 20 Jul 2012 5 11 36 683 UTC PM 如何读取该字符串并提取每个日期 我正在使用SimpleDateFormat类来创
  • 将不同层独立部署到 Azure

    假设我有一个应用程序 它分为各个层 演示 业务 数据访问 如何将这些层独立部署到Azure 问题是关于Azure配置 而不是关于应用程序的架构 应用程序通常分为各种角色 每个角色都是 Windows Server 2008 R2 具有已定义
  • CardMedia高度材质-ui

    我正在努力尝试改变 CardMedia 内图像的高度 我设置样式 const style height 32 并将其用于
  • 使用 pip 从 github 的特定分支安装包

    我遇到了一个非常奇怪的问题 我尝试从我的 github fork 中 pip 安装一个包 我过去曾多次这样做过 而且总是有效 这就是我所做的 pip install git https my branch 虽然这在我的本地计算机上工作得很好
  • Python beautifulsoup 抢表

    我正在尝试从此网页中获取表格 我不确定我是否抓住了正确的标签 这是我到目前为止所拥有的 from bs4 import BeautifulSoup import requests page http www airchina com cn
  • 使用 LINQ to SQL 是否有助于防止 SQL 注入

    我正在建立一个公共站点 我首先想到的是 SQL 注入 我正在保存一些文本字段 并使用 linq 来更新 写入数据库 我使用 linq 安全吗 此示例正在创建用户帐户 Data MemberRegistrationDataContext co
  • 如何在 Android 中关闭/销毁 Firebase 引用?

    这是场景 创建了 firebase 引用 Firebase myRef new Firebase url In Main Activity 用户单击按钮导航到其他活动 调用主活动的 onPause 有没有办法销毁这个构造函数 此引用正在创建
  • Base64 编码图像 blob 未在 IE 中显示

    echo img src height 150 这在 firefox safari 和 chrome 中显示的图像效果很好 但在 Internet Explorer 中它显示了一个漂亮的红十字 我认为这是因为编码的原因 尝试更换data i
  • Nlog目标数据库在运行时设置连接信息

    使用 Nlog 和数据库目标 有没有办法在运行时设置连接信息 我记得我的一些同事也做过类似的事情 他找到了这样的答案 http nlog forum 1685105 n2 nabble com DDL for Database Table
  • 溢出:隐藏不适用于正方向的平移

    我最近遇到了一件奇怪的事情overflow hidden 我将它设置为一个元素 然后我想将其中的元素转换为translate 当它向负方向平移时 它将被隐藏 但如果我向正方向平移 它就不会被隐藏 在桌面浏览器中 它并没有真正显示出来 但您可
  • sp_executesql 与 'IN' 语句

    我试图使用 sp executesql 来防止 SQL 2005 中的 SQL 注入 我有一个像这样的简单查询 SELECT from table WHERE RegionCode in X101 B202 但是 当我使用 sp execu