尝试基于另一个表创建脚本

时间:2018-06-20 14:50:41

标签: sql sql-server

我正在尝试创建一个脚本来为另一个表生成一个插入。这就是我正在使用的:

DECLARE @sql AS NVARCHAR(MAX)

SELECT  @sql = 'select update  UNIDADE set values(CDUNIDADE=' + CONVERT(NVARCHAR,CD_UNIDADE)  
+ ', CDINSTITUICAO=' + 'Ajustar' + ', NOUNIDADE=' 
+ '''' + NO_UNIDADE+ ''''  + ', NORESUMO=' + '''' + NO_UNIDADE+ ''''  + '
, CNPJ=' + '''' + NO_CNPJ + '''' + ', ENDERECO=' + '''' + NO_ENDERECO + '''' + ', BAIRRO=' + '''' + NO_BAIRRO + '''' + ',
 CEP=' + '''' + NO_CEP + '''' + '
, CDCIDADE=' + CD_CIDADE +', FONE1=' + '''' + NO_TELEFONEDIRETOR + '''' + ', FONE2=' + '''' + NO_TELEFONECOORDENADOR + '''' + 
', DIRETOR=' + '''' + NO_DIRETOR + '''' + ', EMAIL_DIRETOR=' + '''' + NO_EMAILDIRETOR + '''' + 
', VDE=' + NULL + ', EMAIL_VDE=' + NULL + ', COORDENADOR=' + '''' + NO_COORDENADOR + '''' + ', EMAIL_COORD=' + '''' + NO_EMAILCOORDENADOR + '''' + '
, SENHA=' + '''' + NO_SENHA + '''' +', CDTIPOUNIDADE=' + NULL +'
, CDUNIDADE_ANT=' + NULL +', CDINSTITUICAO_ANT=' + NULL +', NOCONTRATANTE=' + NULL +', CNPJ_CONTRATANTE=' + NULL +'
, SENHA_ANTERIOR=' + NULL +', OBSERVACAO=' + NULL +  ') where CDUNIDADE = '+ CD_UNIDADE  from UNIDADE

当我尝试执行此语句时,出现此错误:

  

第245层状态1的状态3行
  将varchar值',FONE1 ='转换为数据类型int时转换失败。

在这个阵营中,我有这种尝试的数据类型:

xxxxxxxxxx
(xx)xxxx-xxxx
NULL

阵营是一​​个nvarchar,长度为32。

我在做什么错了?


编辑

我将代码更改为此。现在它几乎可以工作了,它为表中的每一行创建了一个脚本,但是所有内容都为空。

select 'update  UNIDADE set (CDUNIDADE=' + CONVERT(NVARCHAR,CD_UNIDADE)  
+ ', CDINSTITUICAO=' + 'Ajustar' + ', NOUNIDADE=' 
+ '''' + NO_UNIDADE+ ''''  + ', NORESUMO=' + '''' + NO_UNIDADE+ ''''  + '
, CNPJ=' + '''' + NO_CNPJ + '''' + ', ENDERECO=' + '''' + NO_ENDERECO + '''' + ', BAIRRO=' + '''' + NO_BAIRRO + '''' + ',
 CEP=' + '''' + NO_CEP + '''' + '
, CDCIDADE=' + CONVERT(NVARCHAR,CD_CIDADE) +', FONE1=' + '''' + NO_TELEFONEDIRETOR + '''' + ', FONE2=' + '''' + NO_TELEFONECOORDENADOR + '''' + 
', DIRETOR=' + '''' + NO_DIRETOR + '''' + ', EMAIL_DIRETOR=' + '''' + NO_EMAILDIRETOR + '''' + 
', VDE=' + NULL + ', EMAIL_VDE=' + NULL + ', COORDENADOR=' + '''' + NO_COORDENADOR + '''' + ', EMAIL_COORD=' + '''' + NO_EMAILCOORDENADOR + '''' + '
, SENHA=' + '''' + NO_SENHA + '''' +', CDTIPOUNIDADE=' + NULL +'
, CDUNIDADE_ANT=' + NULL +', CDINSTITUICAO_ANT=' + NULL +', NOCONTRATANTE=' + NULL +', CNPJ_CONTRATANTE=' + NULL +'
, SENHA_ANTERIOR=' + NULL +', OBSERVACAO=' + NULL +  ') where CDUNIDADE = '+ CONVERT(NVARCHAR,CD_UNIDADE)    from UNIDADE 

2 个答案:

答案 0 :(得分:0)

我认为这里不需要动态SQL。似乎您正在尝试使用单行中的值更新表...或将它们设置为字符串文字。这是完成的方式:

update  UNIDADE  
set 
    CDUNIDADE = 'cd_unidade'
    ,CDINSTITUICAO = 'Ajustar' 
    ,NOUNIDADE = 'no_unidade' 
    ,NORESUMO = 'no_unidade'
    ,CNPJ = 'no_cnpj'
    ,ENDERECO = 'no_endereco' 
    ,BAIRRO= 'no_bairro' 
    ,CEP= 'no_cep' 
    ,CDCIDADE = 'cd_cidade 
    ,FONE1 = 'no_telefonediretor 
    ,FONE2 = 'no_telefonecoordenador'
    ,DIRETOR = 'no_diretor'
    ,EMAIL_DIRETOR = 'no_emaildiretor'
    ,VDE = NULL
    ,EMAIL_VDE = NULL
    ,COORDENADOR = 'no_coordenador' 
    ,EMAIL_COORD = 'no_emailcoordenador'
    ,SENHA = 'no_senha'
    ,CDTIPOUNIDADE = NULL
    ,CDUNIDADE_ANT = NULL 
    ,CDINSTITUICAO_ANT = NULL 
    ,NOCONTRATANTE = NULL 
    ,CNPJ_CONTRATANTE = NULL 
    ,SENHA_ANTERIOR = NULL 
    ,OBSERVACAO = NULL
where CDUNIDADE = 'CD_UNIDADE'

如果输入错误,并且打算列出不同的表名,则需要使用联接进行更新。像这样:

update u  
set 
    CDUNIDADE = o.cd_unidade
    ,CDINSTITUICAO = o.Ajustar 
    ,NOUNIDADE = o.no_unidade 
    ,NORESUMO = o.no_unidade
    ,CNPJ = o.no_cnpj
    ,ENDERECO = o.no_endereco 
    ,BAIRRO= o.no_bairro 
    ,CEP= o.no_cep 
    ,CDCIDADE = o.cd_cidade 
    ,FONE1 = o.no_telefonediretor 
    ,FONE2 = o.no_telefonecoordenador
    ,DIRETOR = o.no_diretor
    ,EMAIL_DIRETOR = o.no_emaildiretor
    ,VDE = NULL
    ,EMAIL_VDE = NULL
    ,COORDENADOR = o.no_coordenador 
    ,EMAIL_COORD = o.no_emailcoordenador
    ,SENHA = o.no_senha
    ,CDTIPOUNIDADE = NULL
    ,CDUNIDADE_ANT = NULL 
    ,CDINSTITUICAO_ANT = NULL 
    ,NOCONTRATANTE = NULL 
    ,CNPJ_CONTRATANTE = NULL 
    ,SENHA_ANTERIOR = NULL 
    ,OBSERVACAO = NULL
from UNIDADE u
inner join someOtherTable o on o.id = u.id

答案 1 :(得分:0)

我让它起作用。我使用了这段代码。

select  'update  UNIDADE set  CDUNIDADE=' + CONVERT(NVARCHAR,CD_UNIDADE) + ', NOUNIDADE=' 
 + '''' + NO_UNIDADE + ''''  +', NORESUMO=' + '''' + NO_UNIDADE+ ''''  + '
, CNPJ=' + '''' + ISNULL(NO_CNPJ,'NULL') + '''' + ', ENDERECO=' + '''' +  ISNULL(NO_ENDERECO,'NULL') + '''' 
+ ', BAIRRO=' + '''' +ISNULL(NO_BAIRRO,'NULL' )  + '''' + ' ,
 CEP=' + '''' + ISNULL(NO_CEP,'NULL') + '''' + ', CDCIDADE=' +   ISNULL(CONVERT(NVARCHAR,CD_CIDADE),'NULL') +'
 , FONE1=' + '''' + ISNULL(NO_TELEFONEDIRETOR,'NULL' )  + '''' + ', FONE2=' + '''' +  ISNULL(NO_TELEFONECOORDENADOR,'NULL' ) + '''' + 
', DIRETOR=' + '''' + ISNULL(NO_DIRETOR,'NULL' ) + '''' + ', EMAIL_DIRETOR=' + '''' + ISNULL(NO_EMAILDIRETOR,'NULL' ) + '''' + 
', COORDENADOR=' + '''' +ISNULL(NO_COORDENADOR,'NULL' )  + '''' + ', EMAIL_COORD=' + '''' +ISNULL(NO_EMAILCOORDENADOR,'NULL' )   + '''' + '
, SENHA=' + '''' + NO_SENHA + '''' +'  
 where CDUNIDADE ='+CONVERT(NVARCHAR,CD_UNIDADE)   from UNIDADE