2015-06-20 47 views
0

我正在嘗試使用其他變量內的變量和其他變量執行刪除表。一些變量由查詢定義,然後在其他查詢的結果中使用。但是我遇到了這個問題,因爲當我解析我得到時SQL Server:變量刪除表和架構

命令成功完成。

但是,當我嘗試執行我得到以下錯誤信息。

消息245,級別16,狀態1,行18
轉換轉換VARCHAR值 'S' 爲數據類型int時失敗。

我找不出'S'的實際價值。

第18行是指

EXEC @defn_id_query 

,它指的是變量在下面

SET @defn_id_query = (
'SELECT defn_id FROM ' + @systemschema + '.[defn] 
WHERE [defn_type_name] = ''CONTAINER'' 
AND defn_subtype_id = 1 
AND defn_name = ''' + @schema + '' 
) 

上市下面是完整的代碼

DECLARE @defn_ver_id_query varchar 
DECLARE @defn_ver_id int 
DECLARE @defn_id_query varchar 
DECLARE @defn_id int 
DECLARE @schema varchar 
DECLARE @deleteschema varchar 
DECLARE @systemschema varchar 
DECLARE @variableSET varchar 
DECLARE @deletesreferences varchar 
SET @schema = 'fpscdb001_ws_001' 
SET @systemschema = '[fpscdb001_system]' 
SET @defn_id_query = (
'SELECT defn_id FROM ' + @systemschema + '.[defn] 
WHERE [defn_type_name] = ''CONTAINER'' 
AND defn_subtype_id = 1 
AND defn_name = ''' + @schema + '' 
) 
EXEC @defn_id_query 
EXEC @defn_ver_id_query 
SET @defn_id = (@defn_id_query) 
SET @defn_ver_id = (@defn_ver_id_query) 
SET @defn_ver_id_query = ('SELECT [defn_ver_id] 
    FROM ' + @systemschema + '.[defn_ver] 
    WHERE defn_id = @defn_id') 
SET @deleteschema = (
'DROP TABLE ' + @schema + '.[id_generator] 
DROP TABLE ' + @schema + '.[incident] 
DROP TABLE ' + @schema + '.[incident_bal] 
DROP TABLE ' + @schema + '.[incident_event_sum] 
DROP TABLE ' + @schema + '.[incident_FH_HOURS] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE1] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE2] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3a] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3b] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3c] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3d] 
DROP TABLE ' + @schema + '.[incident_FH_Stage4] 
DROP TABLE ' + @schema + '.[incident_ST_STAGE1] 
DROP TABLE ' + @schema + '.[incident_ST_STAGE2]DECLARE @defn_ver_id_query varchar 
DECLARE @defn_ver_id int 
DECLARE @defn_id_query varchar 
DECLARE @defn_id int 
DECLARE @schema varchar 
DECLARE @deleteschema varchar 
DECLARE @systemschema varchar 
DECLARE @variableSET varchar 
DECLARE @deletesreferences varchar 
SET @schema = 'fpscdb001_ws_001' 
SET @systemschema = '[fpscdb001_system]' 
SET @defn_id_query = (
'SELECT defn_id FROM ' + @systemschema + '.[defn] 
WHERE [defn_type_name] = ''CONTAINER'' 
AND defn_subtype_id = 1 
AND defn_name = ''' + @schema + '' 
) 
SET @defn_id = (@defn_id_query) 
SET @defn_ver_id = (@defn_ver_id_query) 
EXEC @defn_id_query 
EXEC @defn_ver_id_query 

SET @defn_ver_id_query = ('SELECT [defn_ver_id] 
    FROM ' + @systemschema + '.[defn_ver] 
    WHERE defn_id = @defn_id') 
SET @deleteschema = (
'DROP TABLE ' + @schema + '.[id_generator] 
DROP TABLE ' + @schema + '.[incident] 
DROP TABLE ' + @schema + '.[incident_bal] 
DROP TABLE ' + @schema + '.[incident_event_sum] 
DROP TABLE ' + @schema + '.[incident_FH_HOURS] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE1] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE2] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3a] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3b] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3c] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3d] 
DROP TABLE ' + @schema + '.[incident_FH_Stage4] 
DROP TABLE ' + @schema + '.[incident_ST_STAGE1] 
DROP TABLE ' + @schema + '.[incident_ST_STAGE2] 
DROP TABLE ' + @schema + '.[incident_ST_STAGE3] 
DROP TABLE ' + @schema + '.[incident_status] 
DROP TABLE ' + @schema + '.[incident_transn] 
DROP TABLE ' + @schema + '.[incident_transn_sum] 
DROP TABLE ' + @schema + '.[item_field_journal] 
DROP SCHEMA ' + @schema 
) 
SET @deletesreferences = (' 
DELETE FROM ' + @systemschema + '.[defn_reln] 
WHERE from_defn_ver_id = @defn_ver_id 
DELETE FROM ' + @systemschema + '.[defn_ver] 
WHERE defn_id = ' + @defn_id + ' 
DELETE FROM ' + @systemschema + '.[cal_wksp] 
WHERE wksp_defn_id = ' + @defn_id + ' 
DELETE FROM ' + @systemschema + '.[bus_proc_defn] 
WHERE defn_id = ' + @defn_id + ' 
DELETE FROM ' + @systemschema + '.[defn] 
WHERE [defn_type_name] = ''CONTAINER'' 
AND defn_subtype_id = 1 
and defn_id = ' + @defn_id) 
EXEC @deleteschema 
EXEC @deletesreferences 

DROP TABLE ' + @schema + '.[incident_ST_STAGE3] 
DROP TABLE ' + @schema + '.[incident_status] 
DROP TABLE ' + @schema + '.[incident_transn] 
DROP TABLE ' + @schema + '.[incident_transn_sum] 
DROP TABLE ' + @schema + '.[item_field_journal] 
DROP SCHEMA ' + @schema 
) 
SET @deletesreferences = (' 
DELETE FROM ' + @systemschema + '.[defn_reln] 
WHERE from_defn_ver_id = @defn_ver_id 
DELETE FROM ' + @systemschema + '.[defn_ver] 
WHERE defn_id = ' + @defn_id + ' 
DELETE FROM ' + @systemschema + '.[cal_wksp] 
WHERE wksp_defn_id = ' + @defn_id + ' 
DELETE FROM ' + @systemschema + '.[bus_proc_defn] 
WHERE defn_id = ' + @defn_id + ' 
DELETE FROM ' + @systemschema + '.[defn] 
WHERE [defn_type_name] = ''CONTAINER'' 
AND defn_subtype_id = 1 
and defn_id = ' + @defn_id) 
EXEC @deleteschema 
EXEC @deletesreferences 

我願意接受其他解決方案專業人士建議什麼?

感謝

編輯:

我猜所有這些撇號的取消是混淆我...我曾嘗試以下

SET @defn_ver_id_query = ('SELECT [defn_ver_id] 
FROM ' + @systemschema + '.[defn_ver] 
WHERE defn_id = convert(nvarchar(max),' + @defn_id + '') 

我自己也嘗試這種方式以及。

SET @defn_ver_id_query = ('SELECT [defn_ver_id] 
FROM ' + @systemschema + '.[defn_ver] 
WHERE defn_id = ' + convert(nvarchar(max),@defn_id) + '') 

新FULL編輯

DECLARE @defn_ver_id_query varchar(max) 
DECLARE @defn_ver_id int 
DECLARE @defn_id_query varchar(max) 
DECLARE @defn_id int 
DECLARE @schema varchar(max) 
DECLARE @deleteschema varchar(max) 
DECLARE @systemschema varchar(max) 
DECLARE @variableSET varchar(max) 
DECLARE @deletesreferences varchar(max) 
SET @schema = 'fpscdb001_ws_001' 
SET @systemschema = '[fpscdb001_system]' 
SET @defn_id_query = (
'SELECT defn_id FROM ' + @systemschema + '.[defn] 
WHERE [defn_type_name] = ''CONTAINER'' 
AND defn_subtype_id = 1 
AND defn_name = ' + @schema + '' 
) 
SET @defn_id = (@defn_id_query) 
SET @defn_ver_id = (@defn_ver_id_query) 
EXEC (@defn_id_query) 
EXEC (@defn_ver_id_query) 

SET @defn_ver_id_query = ('SELECT [defn_ver_id] 
    FROM ' + @systemschema + '.[defn_ver] 
    WHERE defn_id = ' + convert(nvarchar(max),@defn_id) + '') 
SET @deleteschema = (
'DROP TABLE ' + @schema + '.[id_generator] 
DROP TABLE ' + @schema + '.[incident] 
DROP TABLE ' + @schema + '.[incident_bal] 
DROP TABLE ' + @schema + '.[incident_event_sum] 
DROP TABLE ' + @schema + '.[incident_FH_HOURS] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE1] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE2] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3a] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3b] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3c] 
DROP TABLE ' + @schema + '.[incident_FH_STAGE3d] 
DROP TABLE ' + @schema + '.[incident_FH_Stage4] 
DROP TABLE ' + @schema + '.[incident_ST_STAGE1] 
DROP TABLE ' + @schema + '.[incident_ST_STAGE2] 
DROP TABLE ' + @schema + '.[incident_ST_STAGE3] 
DROP TABLE ' + @schema + '.[incident_status] 
DROP TABLE ' + @schema + '.[incident_transn] 
DROP TABLE ' + @schema + '.[incident_transn_sum] 
DROP TABLE ' + @schema + '.[item_field_journal] 
DROP SCHEMA ' + @schema 
) 
SET @deletesreferences = (' 
DELETE FROM ' + @systemschema + '.[defn_reln] 
WHERE from_defn_ver_id = ' + convert(nvarchar(max),@defn_ver_id) + ' 
DELETE FROM ' + @systemschema + '.[defn_ver] 
WHERE defn_id = ' + convert(nvarchar(max),@defn_id) + ' 
DELETE FROM ' + @systemschema + '.[cal_wksp] 
WHERE wksp_defn_id = ' + convert(nvarchar(max),@defn_id) + ' 
DELETE FROM ' + @systemschema + '.[bus_proc_defn] 
WHERE defn_id = ' + convert(nvarchar(max),@defn_id) + ' 
DELETE FROM ' + @systemschema + '.[defn] 
WHERE [defn_type_name] = ''CONTAINER'' 
AND defn_subtype_id = 1 
and defn_id = ' + convert(nvarchar(max),@defn_id)) 
EXEC (@deleteschema) 
EXEC (@deletesreferences) 
+1

聲明'varchar'沒有長度是你的問題的一部分。你還需要在使用'+'連接時將int轉換爲'varchar'。在'exec'調用中需要括號。 –

+0

如果聲明沒有長度的'varchar',它默認爲'varchar(1)'。所以,例如,你的變量'@ defn_ver_id_query' ='S'。再加上其他人指出的一切。 – Andrew

+0

感謝您的快速回復!好吧,現在我已經做出了你和lonic已經做出的調整,現在我收到一條錯誤信息,我相信我錯過了使用「SET」。我希望將defn_id設置爲defn_id_query的結果。 – user2869135

回答

0

我建議:如果你嘗試將值Concat的到一個字符串,它是不是一個字符串

  1. ,將其轉換!示例:SET @string = 'Hello '+CONVERT(nvarchar(max),1);
  2. 如果將值轉換爲NVARCHAR,則需要指定長度。例如:NVARCHAR(100)。就你而言,當你試圖將它連接到一個SQL查詢時,你可以使用CONVERT(nvarchar(max),...)。之後它會回落到較低的長度。
  3. 您嘗試在字符串中使用字符串。例如:SET @string = 'The String holds 'User'!'。這是錯誤的。你需要在字符串中轉義逗號,你可以通過雙引號來做到這一點。看到這個例子:SET @string = 'The String holds ''User''!'
  4. 如果您嘗試將值添加到字符串,則需要將其添加至+:SET @string = 'Hello ' + 'User';
  5. 如果試圖執行動態SQL(你試過),你需要評估SQL變量。您可以通過在字符串周圍使用大括號來完成此操作例如:EXEC(@sqlString)。你試圖這樣做:EXEC @sqlString。這種方式SQL Server查找名爲@sqlString的過程,這是錯誤的。

希望這會幫助您解決所有問題。

+0

@ lonic我已經根據你的建議做了一些調整,我試着根據你的第一個建議進行調整,我已經將它們添加到了我的編輯部分,我相信我現在也更正了我的撇號,並且我在每個exec以及。 – user2869135

+0

是的,現在看起來好多了!初看起來,我認爲它現在應該起作用了? – Ionic

+0

好吧,我在你的代碼中看到了一件事。 SET @defn_ver_id_query =('SELECT [defn_ver_id] ...)'這些括號不需要用於字符串賦值。稍後您需要括號用於'EXEC',但不適用於作業。你可以把它們留在那裏。 – Ionic