2016-12-01 69 views
0

我目前正在处理一个项目,在该项目中,我需要检查SQL Server中链接服务器上是否存在数据。下面的方法是我现在使用的方法,但速度太慢。检查链接服务器上是否存在列

DROP PROCEDURE IF EXISTS dbo.HasEBoekhoudenBybtwnr 
GO 
CREATE PROCEDURE dbo.HasEBoekhoudenBybtwnr(@btwnr varchar(255)) 
AS 
IF (EXISTS(SELECT TOP 1 AbBedrijf FROM [Server].[database].[dbo].[table] WHERE abOBNummer = @btwnr)) 
    SELECT 1 
ELSE 
    SELECT 0 
GO 

我试图用sp_executesql的和开放的SQL,但我不如何与if exists使用它。任何人都可以帮我改进这种方法吗?

+0

u需要检查列或表或两者 – Chanukya

+0

仅列的表本身是相当大的 –

+0

ü可以检查一次。 – Chanukya

回答

0

使用动态如下查询:

DECLARE @sql VARCHAR (500) 
SET @sql = ' 
IF EXISTS(SELECT TOP 1 1 FROM [server].database.dbo.'+ @btwnr + ') 
    SELECT 1 
ELSE 
    SELECT 0 ' 

EXEC(@sql) 

根据您的更新问题,您可以直接比较的变量值列值。动态查询不需要。

+0

没有称为btwnr的表,它是一个存在于表中的值 –

+0

我的意思是说,这个'@btwnr'是一个变量,如果你传递了表名,那么你必须使用动态查询if存在选择,如果列值那么你可以直接在你现在正在做的事情上做。如果其余的东西都是正确的,你不应该得到任何问题。 – Susang

0

我现在已经通过使用sp_executesql修改了该过程,但它在性能或以前没有任何区别。所以我认为最好坚持我原来的程序,除了它没有我想要的那么快。

DROP PROCEDURE IF EXISTS dbo.HasEBoekhoudenBybtwnr 
GO 
CREATE PROCEDURE dbo.HasEBoekhoudenBybtwnr(@btwnr varchar(255)) 
AS 
EXEC sp_executesql N' 
IF (EXISTS(SELECT TOP 1 AbBedrijf FROM [Server].[database].[dbo].[table] WHERE abOBNummer = @btw)) 
    SELECT 1 
ELSE 
    SELECT 0 ', 
N'@btw varchar(255)', 
@btw = @btwnr 
GO 

我还是感谢大家的投入在这个问题上