我在服务器 1 上有一个 SSIS 包。它通过 OLEDB 源 sql 命令文本对位于服务器 2 上的 SQL 数据库执行 SQL 查询。查询是:
SELECT * FROM PRODUCTS
WHERE PRODUCT_NAME IN (?)
这失败了,因为?是标量值而不是表。要解决此问题,有两个选项:
- 使用 STRING_SPLIT
- 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/