2015-06-20 73 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