2016-12-01 74 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 

我還是感謝大家的投入在這個問題上