帮助使用 int 的 TSQL IN 语句

2023-11-29

我正在尝试在存储过程中创建以下选择语句

@dealerids nvarchar(256)

SELECT * 
FROM INVOICES as I
WHERE convert(nvarchar(20), I.DealerID) in (@dealerids)

I.DealerID是表中的一个INT。 Dealerids 的参数将被格式化,例如 (8820、8891、8834)

当我使用提供的参数运行此命令时,我没有返回任何行。我知道这些 DealerID 应该提供行,就像我单独执行一样,我会得到我所期望的结果。 我想我正在做

   WHERE convert(nvarchar(20), I.DealerID) in (@dealerids)

错误地。谁能指出我在这里做错了什么?


使用表值参数(SQl Server 2008 中的新增功能)。通过创建实际的表参数类型来设置它:

CREATE TYPE IntTableType AS TABLE (ID INTEGER PRIMARY KEY)

那么你的程序将是:

Create Procedure up_TEST
    @Ids IntTableType READONLY
AS

SELECT * 
    FROM ATable a
    WHERE a.Id IN (SELECT ID FROM @Ids)

RETURN 0
GO

如果您不能使用表值参数,请参阅:“当表值参数无法满足 SQL Server 2005 及更高版本中的数组和列表时”作者:Erland Sommarskog,那么SQL Server中有很多种分割字符串的方法。本文涵盖了几乎每种方法的优点和缺点。一般来说,您需要创建一个 split 函数。这是 split 函数的使用方式:

SELECT
    *
    FROM YourTable                               y
    INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value

我更喜欢在 SQL 中使用数字表方法来分割字符串但是 SQL Server 中有多种分割字符串的方法,请参阅前面的链接,其中解释了每种方法的优点和缺点。

为了使数字表方法发挥作用,您需要执行一次时间表设置,这将创建一个表Numbers包含从 1 到 10,000 的行:

SELECT TOP 10000 IDENTITY(int,1,1) AS Number
    INTO Numbers
    FROM sys.objects s1
    CROSS JOIN sys.objects s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)

设置 Numbers 表后,创建此拆分函数:

CREATE FUNCTION [dbo].[FN_ListToTable]
(
     @SplitOn  char(1)      --REQUIRED, the character to split the @List string on
    ,@List     varchar(8000)--REQUIRED, the list to split apart
)
RETURNS TABLE
AS
RETURN 
(

    ----------------
    --SINGLE QUERY-- --this will not return empty rows
    ----------------
    SELECT
        ListValue
        FROM (SELECT
                  LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
                  FROM (
                           SELECT @SplitOn + @List + @SplitOn AS List2
                       ) AS dt
                      INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
                  WHERE SUBSTRING(List2, number, 1) = @SplitOn
             ) dt2
        WHERE ListValue IS NOT NULL AND ListValue!=''

);
GO 

现在,您可以轻松地将 CSV 字符串拆分为表并加入其中:

Create Procedure up_TEST
@Ids VARCHAR(MAX)
AS
SELECT * FROM ATable a
WHERE a.Id IN (SELECT ListValue FROM dbo.FN_ListToTable(',',@Ids))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

帮助使用 int 的 TSQL IN 语句 的相关文章

随机推荐

  • 如何根据其他字段值更改 OpenERP 选择字段中的选择?

    我有一个包含四个字段的表单 作物 选择 活动起始日期 至今活跃 区块区域 选择 如何使块区域中的可用选项取决于用户为其他字段选择的值 我不知道是否可以使用选择字段来完成此操作 但是当另一个字段更改值时 您可以更改多对一字段的域 您也许还可以
  • 这是有效的 YAML 吗?

    所以对于我在 C 中的文本解析question 我被定向到 YAML 我在推荐这个库时遇到了困难 所以这是一个快速的方法 heading name A name taco Yes age 32 heading name Another na
  • 意外的命名空间“map” - Android Google Maps API

    这是我的 XML 文件的全部内容 重要的部分是最后的地图片段 它给了我这个错误 标签片段发现意外的命名空间前缀 它似乎不会影响代码 但我很好奇是否有人知道发生了什么 我看过帖子说这是 Lint 问题或 Eclipse 问题 但我使用的是最新
  • (*(int (*)())a)() 是什么意思?

    我是学习C 的初学者 今天看到一个这样的指针函数 int a 我很困惑这是什么意思以及如何轻松理解它 让我们添加一个 typedef 以帮助弄清楚它的正面或反面 typedef int int func ptr int func ptr a
  • JTextPane 和 JTextField 之间的文本选择冲突

    如果存在 JTextField 为什么无法以编程方式选择 JTextPane 中的文本 我认为与专注有关 谢谢 import java awt FlowLayout import java awt GridLayout import jav
  • 从时间选择器中选择时间获取不同时区的时间

    我遇到将选定的小时和分钟转换为国家 地区不同时区的问题 假设如果我选择印度上午 10 点 那么我想知道印度上午 10 点美国 纽约和东京的时间 反之亦然 任何帮助都是值得赞赏的 谢谢 请找到以下解决方案 SimpleDateFormat s
  • 如何将复杂矩阵保存在文件中?

    我必须使用 numpy 的 savetxt 命令将下面显示的包含复杂数据的矩阵保存到扩展名为 H 的文件中 但我无法保存它 要保存的矩阵是 1 0 0 j 0 0 0 j 0 0 0 j 1 0 0 j 1 0 0 j 0 0 0 j 2
  • 如何在球衣资源方法中重写@JsonView

    我有一些使用 JsonView 注释设置的球衣资源方法 以便过滤响应中返回的字段 我希望在某些情况下能够用另一个注释中设置的 JsonView 覆盖 或者有时完全禁用它 某些 queryParam 将用于定义应设置哪个视图进行渲染或是否应禁
  • Swift:在类中实现协议初始化器

    我试图理解为什么 Swift 强制执行一个符合协议的类 并根据需要将初始化程序标记为 这本质上强制所有子类也实现该初始值设定项 指定的超类初始值设定项肯定会被继承吗 下面的引述摘自 Swift 语言指南 https developer ap
  • XmlPullParser如何获取res/raw/xml/xmlfilename?

    我是编程新手 所以如果我在下面的段落中错了 请首先纠正我 Android 中主要使用三种 xml 解析器 Sax Dom 和 XmlPullParser 最后一个选项 同时作为外部资源存在 是 Android 的 核心 因此工作速度更快 但
  • 错误栏末端缺失

    示例代码如下 require ggplot2 stats lt data frame Day 0 5 Mean c 3 2 2 7 0 8 0 2 0 0 Q10 0 0 Q90 c 7 48 4 0 2 2 1 2 0 0 plot lt
  • MSI升级并保留注册表项?

    我们在该领域有一个产品 1 0 我正在尝试更新该产品的安装程序 以便它可以安装旧版本 安装新版本 2 0 我正在使用 Visual Studio 2010 安装项目来执行此操作 我维护了 UpgradeCode 并将删除早期版本设置为 tr
  • 如何获得在C#中编辑app.config的管理员权限?

    我有一个程序 它使用 app config 来存储一些首选项 问题是 如果该程序安装在C program files 那么更改首选项是不可能的 因为所有文件程序文件 仅管理员可用 My code public static bool Edi
  • 使用 ADAL 对 Azure API 应用程序进行身份验证

    我有一个标记为 公共 已验证 的 Azure API 应用程序 并在关联的网关中设置了 Azure Active Directory 身份 详细信息请参阅保护 API 应用程序 然后 我在同一 Azure Active Directory
  • flutter 在小部件的多个实例之间共享状态

    在我的扑动应用程序中 我有一个ConnectivityStatus显示应用程序到我的树莓派的当前连接状态的小部件 在里面initState在我的小部件中 我订阅了一个计时器 每 5 秒检查一次连接并相应更新状态 然后在处理后取消订阅 问题是
  • Android Studio:com.android.ide.common.process.ProcessException:

    我正在尝试将 ArcGis 与 Android Studio 一起使用 我尝试按照以下步骤操作 https developers arcgis com android guide install and set up htm http bl
  • 刷新页面出现 404:仅在使用 /dist 文件夹时发生

    我有一个 LoopBackJS Restful 服务器运行在 localhost 3000 在前端 我有一个简单的 Angular 2 应用程序 它使用上述 API 当出现以下情况时 一切工作正常 使用nodemon运行服务器 根文件夹位于
  • 绘制熊猫时间增量

    我有一个 pandas 数据框 它有两个 datetime64 列和一个 timedelta64 列 这是两列之间的差异 我正在尝试绘制 timedelta 列的直方图以可视化两个事件之间的时间差 然而 仅仅使用df time delta
  • 如何增加Mapkit中userLocation注释的半径

    我的应用程序需要用户许可并将地图移动到该位置 默认情况下在该位置MapKit添加一个正在生成一些脉冲的蓝色图标 我到处搜索 但我发现如何添加一个 1000m 的圆圈userLocation 我不想要这样 你可以说我正在寻求定制userLoc
  • 帮助使用 int 的 TSQL IN 语句

    我正在尝试在存储过程中创建以下选择语句 dealerids nvarchar 256 SELECT FROM INVOICES as I WHERE convert nvarchar 20 I DealerID in dealerids I