2015-10-07 4 views
0

Как получить возвращаемое значение из EXEC sp_executesql @OpenQry, чтобы я мог проверить, существует ли значение в IF EXISTS?Как получить возвращаемое значение из EXEC sp_executesql

DECLARE @TableName VARCHAR(25) 
DECLARE @TD_QUERY NVARCHAR(MAX) 

DECLARE CUR_QRY CURSOR FOR 
SELECT TABLENAME FROM dbo.tbl_table 

OPEN CUR_QRY 
FETCH NEXT FROM CUR_QRY INTO @TableName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

SET @OpenQry = 'SELECT * FROM OPENQUERY(linkedserver,''SELECT TABLENAME FROM DBC.TABLES WHERE TABLEKIND=''''T'''' AND DATABASENAME=''''dbname'''' AND TABLENAME=''''' + @TableName + ''''''')' 

EXEC sp_executesql @OpenQry 

IF EXISTS (SELECT @OpenQry) 
AND EXISTS (SELECT TableName FROM dbo.table WHERE [email protected]) 

FETCH NEXT FROM CUR_QRY INTO @TableName 
END 
CLOSE CUR_QRY 
DEALLOCATE CUR_QRY 
+0

Вы должны поместите результаты вашего динамического sql в таблицу (постоянная, временная или переменная). Есть ли причина, по которой вы не можете просто запросить сервер ссылок? Этот подход к курсору будет высасывать жизнь из вашей работы. –

+0

Возможный дубликат [Как получить результат sp \ _executesql в переменную?] (Http://stackoverflow.com/questions/803211/how-to-get-sp-executesql-result-into-a-variable) – DeanOC

ответ

0

нужно просто поместить переменную, которую вы хотите получить де возвращаемое значение перед sp_executesql

попробовать тис код и дайте мне знать, если работает

DECLARE @TableName VARCHAR(MAX) 
DECLARE @TableNameToDrop VARCHAR(MAX) --NEW 
DECLARE @TD_QUERY NVARCHAR(MAX) 
DECLARE @OpenQry NVARCHAR(MAX) -- Dont forget to declare this variable 
declare @sqldrop nvarchar(max) 


DECLARE CUR_QRY CURSOR FOR 
SELECT TABLENAME FROM dbo.tbl_table 

OPEN CUR_QRY 
FETCH NEXT FROM CUR_QRY INTO @TableName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

SET @OpenQry = 'SELECT * FROM OPENQUERY(linkedserver,''SELECT TABLENAME FROM DBC.TABLES WHERE TABLEKIND=''''T'''' AND DATABASENAME=''''dbname'''' AND TABLENAME=''''' + @TableName + ''''''')' 

EXEC TableNameToDrop = sp_executesql @OpenQry 

/* 
IF EXISTS (SELECT @OpenQry) 
AND EXISTS (SELECT TableName FROM dbo.table WHERE [email protected]) 
*/ 
--maybe you dont need check if the table name existis, jut try this 

IF EXISTS (SELECT TableName FROM dbo.table WHERE [email protected]) 
BEGIN 
    set @sqldrop = 'drop table '+ @TableNameToDrop 
    EXEC sp_executesql @sqldrop 
END 

FETCH NEXT FROM CUR_QRY INTO @TableName 
END 
CLOSE CUR_QRY 
DEALLOCATE CUR_QRY 

С уважением

+0

Это работает! Итак, в IF EXISTS я выполняю IF EXISTS (SELECT @TableName)? – angelcake

+0

также, после IF EXISTS, мне нужно выполнить, чтобы удалить таблицу EXEC sp_executesql N'EXEC ('' DROP TABLE Dbname. '' '+ @ TableName +' '') AT [linkedserver]; ' Синтаксис кажется неправильным, потому что он не бросает таблицу. У тебя есть решение? – angelcake

+0

Вам нужно, если таблица, которую вы хотите сбросить, может быть сброшена. – Andaramis

Смежные вопросы