如何将字符串传递给批量插入而不是文件?

2024-03-21

我曾经使用批量插入命令来转换 Csv 文件 int 表。最近,我将 CSV 文件保存为 SQL Server 中的 VarBinary 值。现在我可以通过使用 CAST 和 CONVERT 函数将其类型转换为 Varchar 来从 Varbinary 文件中获取数据。但是现在我遇到一个问题,无法使用批量插入将包含 csv 内容的 Varchar 字符串转换为表。任何人都可以帮助我吗 我的示例代码如下:

--@String contains varchar value of CSV file content.  
SET @sql = 'BULK INSERT TempCsv
FROM  ''' + @String  + '''
WITH
(
    FIRSTROW = 2,
    FIELDTERMINATOR = '','',  
    ROWTERMINATOR = ''\n'',   
    TABLOCK
)'

请帮助我。有没有任何方法或替代方法可以将数据从 csv 字符串插入到表中。


编辑:允许多个字符分隔符

我就是这样解决的。它涉及:

  • 表值函数 (xftSplit) 用于将换行符 (char(10)) 拆分为表格行
  • 标量函数 (fSubstrNth) 用于在给定分隔符的情况下提取行的第 n 个字段
  • 标量函数 (fPatIndexMulti) 用于查找分隔符的第 n 个索引
  • (可选)替代方案Right接受负值的函数
  • 最后,在您的解决方案中使用一些特定的代码,因为 SQL 不允许动态表函数定义(换句话说,您不能SELECT来自具有动态列的函数)

现在,对于代码片段:

xftSplit

-- =============================================
-- Author:      Bernardo A. Dal Corno
-- Create date: 15/07/2014
-- Description: Quebra valores a partir de caracteres e retorna lista em tabela
-- =============================================
CREATE FUNCTION [dbo].[xftSplit] 
(
    @Texto varchar(max),
    @Splitter varchar(3)
)
RETURNS 
@Lista TABLE 
(
    ValoresQuebrados varchar(8000)
)
AS
BEGIN
DECLARE @Pos Smallint

  While len(@Texto)>0 BEGIN
    SET @Pos = Patindex('%'+@Splitter+'%',@Texto)

    IF @Pos > 0 BEGIN
      INSERT INTO @Lista
      SELECT left(@Texto, @Pos-1)

      SET @Texto = right(@Texto, len(@Texto)-@Pos)
    END
    ELSE BEGIN
      INSERT INTO @Lista
      SELECT @Texto

      SET @Texto = ''
    END
  End

  RETURN 
END

fSubstrNth

-- =============================================
-- Author:      Bernardo A. Dal Corno
-- Create date: 18/07/2017
-- Description: substring com 2 PatIndex limitando inicio e fim
-- =============================================
CREATE FUNCTION fSubstrNth
(
  @Text varchar(max),
  @Sep varchar(3),
  @N int --Nth campo
)
RETURNS varchar(max)
AS
BEGIN
  DECLARE @Result varchar(max)

  IF @N<1 RETURN ''
  IF @N=1
    SET @Result = substring(@Text, 1, dbo.fPatIndexMulti(@Sep,@Text,1)-1)
  ELSE
    SET @Result = substring(@Text, dbo.fPatIndexMulti(@Sep,@Text,@N-1)+LEN(@Sep), CASE WHEN dbo.fPatIndexMulti(@Sep,@Text,@N)>0 THEN dbo.fPatIndexMulti(@Sep,@Text,@N)-dbo.fPatIndexMulti(@Sep,@Text,@N-1)-LEN(@Sep) ELSE LEN(@Text)+1 END)

  RETURN @Result
END

fPatIndexMulti

-- =============================================
-- Author:      Bernardo A. Dal Corno
-- Create date: 17/07/2017
-- Description: recursive patIndex
-- =============================================
CREATE FUNCTION [dbo].[fPatIndexMulti]
(
  @Find varchar(max),
  @In varchar(max),
  @N tinyint
)
RETURNS int
AS
BEGIN
  DECLARE @lenFind int, @Result int, @Texto varchar(max), @index int
  DECLARE @i tinyint=1

  SET @lenFind = LEN(@Find)-1
  SET @Result = 0
  SET @Texto = @In
  WHILE (@i <= @N) BEGIN
    SET @index = patindex('%'+@Find+'%',@Texto)
      IF @index = 0 RETURN 0
    SET @Result = @Result + @index
    SET @Texto = dbo.xRight(@Texto, (@index + @lenFind)*-1)

    SET @i = @i + 1
  END
  SET @Result = @Result + @lenFind*(@i-2)

  RETURN @Result
END

xRight

-- =============================================
-- Author:      Bernardo A. Dal Corno
-- Create date: 06/01/2015
-- Description: Right inverso (para nros < 0)
-- =============================================
CREATE FUNCTION [dbo].[xRight] 
(
  @Texto varchar(8000),
  @Qntd int
)
RETURNS varchar(8000)
AS
BEGIN
  DECLARE @Result varchar(8000)

  IF (Len(@Texto) = 0) OR (@Qntd = 0)
    SET @Result = ''
  ELSE IF (@Qntd > 0) 
      SET @Result = Right(@Texto, @Qntd)
    ELSE IF (@Qntd < 0)
    SET @Result = Right(@Texto, Len(@Texto) + @Qntd)

  RETURN @Result
END

具体代码

SELECT 
     acolumn = 'any value',
     field1 = dbo.fSubstrNth(line,',',1),
     field2 = dbo.fSubstrNth(line,',',2),
     anothercolumn = 'set your query as you would normally do',
     field3 = (CASE dbo.fSubstrNth(line,',',3) WHEN 'C' THEN 1 ELSE 0 END)
FROM (
  SELECT line = ValoresQuebrados FROM dbo.xftSplit(@StringVariable, char(10))
) lines

注意:

  • fSubstrNth接收要从该行中提取的第 n 个字段
  • xftSplit接收一个变量,其中包含您想要批量处理的字符串(无论来源如何)和一个char(10)作为分离器\n,但也可以是其他任何东西
  • 该查询可以与任何其他查询一样。这意味着它可以存储在过程、表函数、视图等中。您可以按照您希望的任何顺序提取部分或全部字段,并按照您想要的方式进行处理
  • 如果在存储过程中使用,您可以创建一种通用方法来创建查询和临时表,以加载带有动态列的字符串,但您必须调用另一个过程才能使用数据或创建一个特定的查询,如上面的相同的过程(这将使其非通用,只是更可重用)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将字符串传递给批量插入而不是文件? 的相关文章

  • 根据条件生成脚本

    可以使用 SQL Server Management Studio 生成特定表的插入 方法是右键单击数据库 gt 任务 gt 生成脚本 选择表 最后仅选择数据 然而 随着时间的推移 表变得越来越大 我只需要具有特定条件的插入 这只会返回该表
  • 哪种本机 dotNet 数据类型最适合传递 SQL Server HierarchyId 值?

    具体来说 我们有一个接受 HierarchyId 作为参数的 SQL Server 存储过程 并且通常我们的存储过程上有一个 SOAP 层 允许通过 SOAP 调用它们 SOAP 服务是使用 C 方法上的 WebMethod 属性来实现的
  • Crystal Reports 假定存储过程中列的数据类型错误

    Crystal Reports Engine 有时认为从某些存储过程返回的字段实际上是类型的原因是什么money is a varchar 255 因此 我无法应用任何数字格式 你确定你有铸成金钱的领域吗 您最近是否更改了数据类型 并且之后
  • 如何在 T-SQL 中实现 ZIP JOIN?

    假设我有表 Foo Id Color 1 Red 2 Green 3 Blue 4 NULL 和表 Bar Value 1 2 5 我想使用简单的语句创建表 Result 来获取 Id Color Value 1 Red 1 2 Green
  • 在 SQLCMD 模式下格式化输出?

    有没有办法可以指定输出文件格式SQLCMD模式这样我就可以使用它读回来BULK INSERT 我想做这样的事情 CONNECT SERVER1 OUT E test SELECT TOP 100 ID NAME FROM DB1 dbo T
  • 需要 SQL Server 查询帮助

    我在视图中存储一堆数据 将 MS Access 查询转换为视图 现在我想做的是编写一个存储过程来根据添加数据的时间提取数据 这是我正在运行的查询 Select Name PlanID ApptDate 1stAppt rn from Sel
  • 插入后用触发器更新多行(sql server)

    我有一个表 orderDetails 包含订单的产品 产品编号 color size quantity 和一个表库存 产品编号 size color stock 订单完成后 我使用此查询将项目插入表中orderDetails INSERT
  • SQL SERVER 中的排序依据和大小写

    我需要在存储过程中按功能排序 一个值被发布到网络服务 并且基于该值我必须以某种方式对结果进行排序 即 当 ColName 按 ColName 发布订单时 当 ColName2 由 ColName2 发布订单时 我正在研究使用 Case 但出
  • 表名搜索

    我使用以下命令在特定数据库的存储过程中搜索字符串 USE DBname SELECT Name FROM sys procedures WHERE OBJECT DEFINITION OBJECT ID LIKE xxx 修改上面的内容是否
  • SQL Server freetexttable 部分单词

    我第一次使用 SQL 自由文本搜索 我有点困惑为什么它会这样 我有一个联系人表 用户可以搜索并且我正在使用 SELECT Contacts Rank FROM FREETEXTTABLE Contacts O Roarty AS Conta
  • Visual Studio 2010 与 SQL Server 2012 商业智能的正确安装顺序

    我有一个 Windows 7 64 位 旗舰版 虚拟机 想要安装以下内容 Visual Studio 2010 Ultimate SQL Server 2012 Business Intelligence with SSIS and SSR
  • 从表中删除孤儿

    我正在尝试清理一张有很多孤立项目的桌子 我通过查找空值来检查是否与另一个表存在关系来解决此问题 DELETE FROM table1 LEFT JOIN table2 ON table1 ID table2 ID WHERE table2
  • 如何授予所有表的 REFERENCES 权限

    我必须授予REFERENCES登录权限说sql login 我可以给予资助REFERENCES对单个表的权限 例如 GRANT REFERENCES ON Mytable TO sql login 有什么办法可以授予REFERENCES允许
  • 如何在 SQL Server 中的特定字符后分割字符串并将该值更新到特定列

    我有包含数据的表格1 1 to 1 20在一列中 我想要值 1 到 20 即 前斜杠 之后的值更新到 SQL Server 中同一表中的其他列 Example 专栏有价值1 1 1 2 1 3 1 20新列值1 2 3 20 也就是说 我要
  • 如何在SSRS 2012中显示基于总金额的前10名

    我只需要显示前 10 名Class基于Total SUM Premium 柱子 我转到类代码属性组 gt 过滤器并按 SUM Net Written Premium 设置前 10 名 但它不起作用 我只需要显示前 10 名 而且总金额也应该
  • Scrapy - 如何抓取网站并将数据存储在 Microsoft SQL Server 数据库中?

    我正在尝试从我们公司创建的网站中提取内容 我在 MSSQL Server 中为 Scrapy 数据创建了一个表 我还设置了 Scrapy 并配置了 Python 来抓取和提取网页数据 我的问题是 如何将Scrapy爬取的数据导出到我本地的M
  • SQL Server,插入 Excel“链接服务器”时出现“无效列名”错误

    我有一个简单的 Excel 电子表格文档 运行 Office 2013 我使用 Microsoft Office 15 0 Access 数据库引擎 OLE DB 提供程序 将其用作数据库 我可以使用 MS SQL Server Manag
  • 了解 SSMS 2008 中关系的更新和删除规则

    当我们定义外键约束时 我对 SQL Server 2008 Management Studio 中的更新和删除规则的含义感到困惑 我也没有找到相关的帮助文档 例如F1帮助 这是屏幕快照 如果有人能描述它们的含义并推荐一些相关文档来阅读 我将
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql

随机推荐