Sql 跨不同数据库SSI的全局临时表
我有两个数据库中的两个表。我需要在数据库a中设置一个标志,其中该行存在于数据库b中。 我在考虑使用SSIS包并将b存储在全局临时表中,然后使用该全局临时表在a中设置标志。 这种范围界定可能吗 以下是我的疑问。两人的任务不同。 数据库b到全局临时表 从基于全局临时表的 我已经试过了,但出现了以下错误 在预期条件的上下文中指定的非布尔型表达式,靠近“,”。。可能的失败原因:查询问题、ResultSet属性设置不正确、参数设置不正确或连接建立不正确 我还将全局临时表的名称更改为无效名称,并得到了相同的错误。Sql 跨不同数据库SSI的全局临时表,sql,ssis,Sql,Ssis,我有两个数据库中的两个表。我需要在数据库a中设置一个标志,其中该行存在于数据库b中。 我在考虑使用SSIS包并将b存储在全局临时表中,然后使用该全局临时表在a中设置标志。 这种范围界定可能吗 以下是我的疑问。两人的任务不同。 数据库b到全局临时表 从基于全局临时表的 我已经试过了,但出现了以下错误 在预期条件的上下文中指定的非布尔型表达式,靠近“,”。。可能的失败原因:查询问题、ResultSet属性设置不正确、参数设置不正确或连接建立不正确 我还将全局临时表的名称更改为无效名称,并得到了相同的
如果这一级别的范围界定不起作用,除了创建一个新表,我还能做什么呢?试试这个。。不能在col1、col2中使用此函数,而必须在column1=col1和column2=col2中使用AND运算符
实际上,您看到了一个与temp表无关的错误—尝试在IN运算符中使用两个不同的列。要获得此功能,必须将WHERE子句和in子句中的两个值连接起来,如下所示:
SELECT [FirstName]
,[LastName]
,[WatchFlag]
FROM [Patient]
WHERE ([FirstName]+ '|' + [LastName]) IN
(
SELECT [FirstName]+ '|' + [LastName]
FROM ##TempWatchList
)
编辑:如果连接不适合您,请尝试下面建议的一些解决方案
基于此,Denny先生提出的方案将是最有效的方案,如下所示:
SELECT [FirstName]
,[LastName]
,[WatchFlag]
FROM [Patient]
WHERE EXISTS
(
SELECT *
FROM ##TempWatchList wl
WHERE
wl.FirstName = Patient.FirstName AND
wl.LastName = Patient.LastName
)
单独查询这两个名称不会返回正确的值:如果在TempWatchList中,FirstName显示在记录321中,而LastName显示在记录986中,该怎么办?事实上,如果在TempWatchList的任何一行中都找到了所考虑的FirstName,则AND运算符会非常满意,只要在任何行中也找到了LastName,而该行可能与FirstName相同,也可能与FirstName不同。尝试了该操作后,得到的对象名称“TempWatchList”无效,因此我猜您不能跨不同的数据库使用全局临时表?实际上,这是一件好事-这意味着您已修复了一个错误,现在你可以做你认为你拥有的那个了。逐步完成向SSI添加临时变量的演练,并让我知道您是否能够使其工作。我已使其工作,但速度非常慢。我可以想象它来自于连接。我想没有别的办法了吧?我曾考虑在目标数据库中创建一个临时表,并使用该表来查询该表,但SSIS不允许我选择它。我已编辑以包含一个替代项,并链接到一个包含更多内容的问题。你是不是应该考虑制定一张真正的表格呢?将它放在临时表中有什么好处?它放在临时表中的唯一原因是数据不会永久存储在临时表中。它只需要在运行时设置标志。想一想,做一张永久桌要快得多。只是我无法控制那个数据库。我将尝试将连接的变量插入一个临时表中,看看结果如何。它有点慢,不像另一条路慢,但现在应该可以了。
SELECT [FirstName],
[LastName],
[WatchFlag]
FROM [Patient]
WHERE [FirstName] IN (SELECT [FirstName]
FROM ##TempWatchList)
AND [LastName] IN (SELECT [LastName]
FROM ##TempWatchList)
SELECT [FirstName]
,[LastName]
,[WatchFlag]
FROM [Patient]
WHERE ([FirstName]+ '|' + [LastName]) IN
(
SELECT [FirstName]+ '|' + [LastName]
FROM ##TempWatchList
)
SELECT [FirstName]
,[LastName]
,[WatchFlag]
FROM [Patient]
WHERE EXISTS
(
SELECT *
FROM ##TempWatchList wl
WHERE
wl.FirstName = Patient.FirstName AND
wl.LastName = Patient.LastName
)