Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:变量删除表和架构_Sql Server_Variables - Fatal编程技术网

Sql server SQL Server:变量删除表和架构

Sql server SQL Server:变量删除表和架构,sql-server,variables,Sql Server,Variables,我试图使用变量和其他变量中的其他变量执行drop表。一些变量由查询定义,然后在其他查询的结果中使用。然而,当我解析我得到的数据时,我对此有一个问题 命令已成功完成 但是,当我尝试执行时,我会收到以下错误消息 Msg 245,第16级,状态1,第18行 将varchar值“S”转换为数据类型int时,转换失败 我不知道什么东西真正有“S”的值 第18行是指 EXEC @defn_id_query 它所指的变量如下所列 SET @defn_id_query = ( 'SELECT defn_id

我试图使用变量和其他变量中的其他变量执行drop表。一些变量由查询定义,然后在其他查询的结果中使用。然而,当我解析我得到的数据时,我对此有一个问题

命令已成功完成

但是,当我尝试执行时,我会收到以下错误消息

Msg 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) + '')
新的完整编辑

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)
我建议:

  • 如果您试图将一个值转换为一个非字符串的字符串,请将其转换!示例:
    SET@string='Hello'+CONVERT(nvarchar(max),1)
  • 如果将值转换为
    NVARCHAR
    ,则需要指定长度。示例:
    NVARCHAR(100)
    。在您的例子中,当您尝试将其转换为SQL查询时,您只需使用
    CONVERT(nvarchar(max),…)
    。之后它将回落到较低的长度
  • 您尝试在字符串中使用字符串。示例:
    SET@string='字符串包含“User”!'。这是错误的。您需要在字符串中转义逗号,您可以通过双引号来实现。请参见此示例:
    SET@string='字符串包含“用户”!'
  • 如果您试图向字符串添加值,则需要在字符串之间添加+:
    SET@string='Hello'+'User'
  • 如果尝试执行动态SQL(您已经尝试过),则需要计算SQL变量。可以通过在字符串周围使用大括号来完成此操作。示例:
    EXEC(@sqlString)
    。您尝试这样做:
    EXEC@sqlString
    。这就是SQL Server查找名为@sqlString的过程的方式,这是错误的

  • 希望这将帮助您解决所有问题。

    不使用长度声明
    varchar
    是您的问题的一部分。当使用
    +
    进行连接时,还需要将int强制转换为
    varchar
    。在
    exec
    调用中需要括号。如果声明
    varchar
    而没有长度,则默认为
    varchar(1)
    。例如,您的变量
    @defn\u ver\u id\u query
    ='S'。加上其他人所指出的一切。谢谢你的快速回复!好的,现在我已经做了你和lonic所做的调整,现在我收到了一条错误消息,我相信我错过了使用“SET”。我希望将defn_id设置为defn_id_查询的结果。在进行了一些查找之后,我相信我应该使用“sp_executesql”,仍在尝试找到一个与我使用的结果相近的示例。@lonic我根据您的建议做了一些调整,我试着根据你的第一个建议进行调整,我已经将它们添加到我的编辑部分,我相信我的撇号现在也被更正了,我在我的每个执行官周围也添加了()。是的,现在看起来好多了!乍一看,我认为它现在应该可以工作了?嗯,我在你的代码中看到了一件事
    SET@defn\u ver\u id\u query=('SELECT[defn\u ver\u id]…)
    字符串赋值不需要这些括号。稍后,您需要为
    EXEC
    使用括号,但分配不需要括号。你可以把它们留在那里。