sql - 当数据库兼容性级别设置为 SQL Server 2008 时,如何在 SSIS OLE DB 源 SQL 命令中使用 STRING_SPLIT?

标签 sql sql-server t-sql ssis etl

我在服务器 1 上有一个 SSIS 包。它通过 OLEDB 源 sql 命令文本对位于服务器 2 上的 SQL 数据库执行 SQL 查询。查询是:

SELECT * FROM PRODUCTS
WHERE PRODUCT_NAME IN (?)

这失败了,因为?是标量值而不是表。要解决此问题,有两个选项:

  1. 使用 STRING_SPLIT
  2. Create string split function

我无法使用选项1,因为虽然它是SQL Server 2017,但数据库兼容性级别设置为2008(级别100)。仅支持更高兼容级别的 STRING_SPLIT。我无权更改此设置。

我无法使用选项 2,因为我不允许在该数据库上创建任何新的自定义函数。

有解决办法吗?我已经阅读了有关将自定义函数添加到主数据库中的信息,但不确定 future 的 SQL 更新是否可能会重置它,因为用户函数不应该放置在主数据库中。

最佳答案

一种方法是将上下文切换到确实具有所需兼容性级别的数据库(下面的tempdb)。

DECLARE @ProductNames VARCHAR(MAX) = ? 

CREATE TABLE #ProductNames
(
PRODUCT_NAME VARCHAR(50) PRIMARY KEY
)

EXEC tempdb.sys.sp_executesql N'INSERT INTO #ProductNames SELECT DISTINCT value FROM STRING_SPLIT(@ProductNames, '','')',
                       N'@ProductNames VARCHAR(MAX)',
                       @ProductNames = @ProductNames;

SELECT *
FROM   PRODUCTS
WHERE  PRODUCT_NAME IN (SELECT pn.PRODUCT_NAME
                        FROM   #ProductNames pn)

DROP TABLE #ProductNames 

关于sql - 当数据库兼容性级别设置为 SQL Server 2008 时,如何在 SSIS OLE DB 源 SQL 命令中使用 STRING_SPLIT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70507301/

相关文章:

sql - 如何在 SQL Server 中查找存储过程执行时间?

sql-server - 连接 SQL 表并将列显示为行以生成报告

c# - 相当于休眠中的 ROW_NUMBER() 函数

sql - Access DB 上的 SQL ISNULL() 参数数量错误

sql - 递归 CTE 的执行速度比硬编码递归操作慢

sql - T-SQL - 复制和转置数据

sql-server - 将 XML 输出转换为 varchar

php - 使用 join (codeigniter) 从单个字段中检索并打印逗号分隔符后的值

sql - 选择 SQL Server 数据库大小

SQL Server SELECT 最后 N 行