none
Função Sql para rodar script's em geral... URGENTE RRS feed

  • Pergunta

  • Boa noite,

     

    Criei uma funçãoSql para executar comandos diversos no banco. Mas depedendo do comando, tipo um script de alteração em uma tabela no banco, a função não consegue executar, sendo que no query analyzer funciona corretamente!

     

    A função:

     

    public static object mtdSqlExec(string pcNomServ, string pcNomBanc, string pcCmdSql, IsolationLevel pcIsoLevel)

    {

    object loReturn;

    SqlConnection cn = new SqlConnection();

    cn.ConnectionString = "Persist Security Info=False;" +

       "Integrated Security=SSPI;" +

       "database=" + pcNomBanc.Trim() + ";" +

       "server=" + pcNomServ.Trim() + ";" +

       "Packet Size=4096";

    try

    {

    cn.Open();

    SqlTransaction sqlTr = cn.BeginTransaction(pcIsoLevel, "SqlTrans");

    SqlCommand cmd = new SqlCommand(pcCmdSql, cn, sqlTr);

    sqlTr.Commit();

    loReturn = cmd.ExecuteNonQuery();

    cn.Close();

    }

    catch (SqlException e)

    {

    loReturn = (object)("Server: Msg " + e.Number + ", Level " + e.Class + ", State " + e.State +

    ", Line " + e.LineNumber + "\n" + e.Message);

    }

    return (loReturn);

    }

     

    Script:

     

    BEGIN TRANSACTION

    SET QUOTED_IDENTIFIER ON

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

    SET ARITHABORT ON

    SET NUMERIC_ROUNDABORT OFF

    SET CONCAT_NULL_YIELDS_NULL ON

    SET ANSI_NULLS ON

    SET ANSI_PADDING ON

    SET ANSI_WARNINGS ON

    COMMIT

    BEGIN TRANSACTION

    ALTER TABLE dbo.Vendas ADD

    CodVenda int NOT NULL CONSTRAINT DF_Vendas_CodVenda DEFAULT 0

    GO

    COMMIT

     

    Mensagem de Erro:

     

    Server: Msg 170, Level 15, State 1, Line 14

    Line 14: Incorrect syntax near 'GO'.

     

    Resumindo, estou criando uma solução para rodar qualquer tipo de script no banco! Como se fosse um Query Analyzer, e coloquei essa pergunta aqui porque já a fiz várias vezes nu forum C# e nunca fui respondido!!!

     

    Muito Obrigado,

     

    Aguardo resposta...

     

    Vinícius Oliveira e Marra

    domingo, 3 de fevereiro de 2008 04:16

Respostas

  •  

    Olá Vinícius,

     

    Como dá para ver na mensagem de erro, o problema está no GO. Ele só é reconhecido pelo Query Analyzer e pelo comando (no DOS) OSQL.

     

    O GO é colocado no script para fazer a execução em lotes, e algumas instruções não podem ser executadas no mesmo lote.

     

    Como solução, eu diria para você dividir os scripts no momento que for encontrado um GO. Não sou programador, mas vou tentar exemplificar:

    -> Abre sessão com SQL

    -> Executa parte antes do GO

    -> Executa parte depois do GO

    -> Fecha sessão

     

    Assim deve funcionar perfeitamente, e tudo controlado pela sua aplicação, sem fazer nada no SQL.

     

     

    Abraço!!!

    domingo, 3 de fevereiro de 2008 12:43
  •  

    alleolli,

     

    Não é tão simples assim. Existem instruções que não podem ser executadas em conjunto (no mesmo lote), faça um teste rodando o seguinte script, todo ele:

     

    Code Snippet

    -- inicio da primeira view

    create view dbo.V1

    as

    select * from teste

    -- fim da primeira view

    -- inicio da segunda view

    create view dbo.V2

    as

    select * from teste

    -- fim da segunda view

     

     

     

    Vai dar erro. Por isso dei a idéia de quebrar o script em vários usando como separador o GO.

     

    Abraço!!!

    quinta-feira, 7 de fevereiro de 2008 04:15
  •  

    Olá Pessoal

     

    eu Fiz uma Forma de Executar um Script Por Blocos Mesmo que ele Tenha 'GO'

    Dessa Forma podemos Executar Um Script Gerado Pelo 'SQL Manager for SQL Server' Sem Problemas

     

    Exemplo de Script: ("C:\Banco.sql")

    Code Snippet

    CREATE TABLE [dbo].[credito] (
      [id_credito]int IDENTITY(1, 1) NOT NULL,
      [id_nota_fiscal]int NULL,
      [id_centro]int NULL,
      [dt_movimento]datetime NULL,
      [dt_vencimento]datetime NULL,
      [dt_pagamento]datetime NULL,
      [descricao]varchar(100) COLLATE Latin1_General_CI_AS NULL,
      [valor]decimal(18, 2) NULL,
      [valor_pago]decimal(18, 2) NULL,
      [status]varchar(25) COLLATE Latin1_General_CI_AS NULL,
      [parcela]int NULL,
      [id_cliente]int NULL
    )
    ON [PRIMARY]
    GO

    --
    -- Definition for table debito :
    --

    CREATE TABLE [dbo].[debito] (
      [id_debito]int IDENTITY(1, 1) NOT NULL,
      [id_nota_fiscal]int NULL,
      [id_centro]int NULL,
      [id_fornecedor]int NULL,
      [dt_movimento]datetime NULL,
      [dt_vencimento]datetime NULL,
      [dt_pagamento]datetime NULL,
      [descricao]varchar(100) COLLATE Latin1_General_CI_AS NULL,
      [valor]decimal(18, 2) NULL,
      [valor_pago]decimal(18, 2) NULL,
      [status]varchar(25) COLLATE Latin1_General_CI_AS NULL,
      [parcela]int NULL
    )
    ON [PRIMARY]
    GO

     

     

    Solucão Para Executar, Pode Ter Views SP

    Code Snippet

    Sub ExecutaSql(ByVal path As String)

    If AbreCon() = False Then

    Exit Sub

    End If

    Try

    Dim sr As IO.StreamReader = IO.File.OpenText(path)

    Dim Bloco As String = String.Empty

    Dim Linha As String = String.Empty

    Dim cmd As SqlCommand = CN.CreateCommand

    cmd.CommandType = CommandType.Text

     

    Try

    cmd.CommandText = "USE [" & Me.cbBanco.Text & "]"

    cmd.ExecuteNonQuery()

    Catch ex As Exception

    MessageBox.Show("Erro ao Selecionar o Banco de Dados!")

    Exit Sub

    End Try

     

    While Linha IsNot Nothing

    Linha = sr.ReadLine

    If Linha <> "GO" Then

    Bloco = Bloco & ControlChars.NewLine & Linha

    Else

    If Bloco <> "" Then

    cmd.CommandText = Bloco

    Try

    cmd.ExecuteNonQuery()

    Catch ex As Exception

    MessageBox.Show("Erro ao executar o Seguinte Bloco de Comandos:" & ControlChars.NewLine & Bloco & ControlChars.NewLine & ex.Message)

    End Try

    Bloco = String.Empty

    End If

    End If

    End While

     

    Catch ex As Exception

    MessageBox.Show("Erro ao Criar o Banco de Dados!" & ControlChars.NewLine & ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)

    End Try

     

    End Sub

     

     

    use asssim

    ExecutaSql("C:\Banco.sql")

    sexta-feira, 22 de fevereiro de 2008 20:11

Todas as Respostas

  •  

    Olá Vinícius,

     

    Como dá para ver na mensagem de erro, o problema está no GO. Ele só é reconhecido pelo Query Analyzer e pelo comando (no DOS) OSQL.

     

    O GO é colocado no script para fazer a execução em lotes, e algumas instruções não podem ser executadas no mesmo lote.

     

    Como solução, eu diria para você dividir os scripts no momento que for encontrado um GO. Não sou programador, mas vou tentar exemplificar:

    -> Abre sessão com SQL

    -> Executa parte antes do GO

    -> Executa parte depois do GO

    -> Fecha sessão

     

    Assim deve funcionar perfeitamente, e tudo controlado pela sua aplicação, sem fazer nada no SQL.

     

     

    Abraço!!!

    domingo, 3 de fevereiro de 2008 12:43
  • Bom dia Alexandre,

     

    Entendi sua ideia, creio que funcione mas dê uma olhada nos scripts que esse software irá rodar!

     

    Ex. do script.:

     

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CtbVwiSdSoC]') and OBJECTPROPERTY(id, N'IsView') = 1)
    drop view [dbo].[CtbVwiSdSoC]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CtbVwiSdSoD]') and OBJECTPROPERTY(id, N'IsView') = 1)
    drop view [dbo].[CtbVwiSdSoD]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CtbVwiSProC]') and OBJECTPROPERTY(id, N'IsView') = 1)
    drop view [dbo].[CtbVwiSProC]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CtbVwiSProD]') and OBJECTPROPERTY(id, N'IsView') = 1)
    drop view [dbo].[CtbVwiSProD]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CtbVwiSdCcC]') and OBJECTPROPERTY(id, N'IsView') = 1)
    drop view [dbo].[CtbVwiSdCcC]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CtbVwiSdCcD]') and OBJECTPROPERTY(id, N'IsView') = 1)
    drop view [dbo].[CtbVwiSdCcD]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CtbVwiSdCtC]') and OBJECTPROPERTY(id, N'IsView') = 1)
    drop view [dbo].[CtbVwiSdCtC]
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CtbVwiSdCtD]') and OBJECTPROPERTY(id, N'IsView') = 1)
    drop view [dbo].[CtbVwiSdCtD]
    GO

    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GO


    CREATE VIEW dbo.CtbVwiSProC
    WITH SCHEMABINDING
    AS
    SELECT COUNT_BIG (*) AS nQuaRegi, YEAR(dDatLanc) AS nNumAno, MONTH(dDatLanc) AS nNumMes, nCodContC AS nCodCont,
     nCodEmprC3 As nCodEmpr3, nCodAuxiC AS nCodProd, nCodCoPrC AS nCodCoPr, nCodLocaC AS nCodLoca,
     nCodRastC AS nCodRast, SUM(nVlrLanc) AS nVlrLanc, SUM(nQuaLancC) AS nQuaLanc
    FROM         dbo.CtbTblLCtb
    WHERE     (cDesAuxiC = 'PROD') AND (nCodAuxiC > 0)
    GROUP BY YEAR(dDatLanc), MONTH(dDatLanc), nCodContC, nCodEmprC3, nCodAuxiC, nCodCoPrC, nCodLocaC, nCodRastC

     

     

     

     

     

     

     

     

    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

    set ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS on
    GO

    set NUMERIC_ROUNDABORT off
    GO

     CREATE  UNIQUE  CLUSTERED  INDEX [PV_SProC] ON [dbo].[CtbVwiSProC]([nNumAno], [nNumMes], [nCodCont], [nCodEmpr3], [nCodProd], [nCodCoPr], [nCodLoca], [nCodRast]) ON [INDICES]
    GO

    set NUMERIC_ROUNDABORT off set arithabort  OFF
    GO

    SET QUOTED_IDENTIFIER OFF
     
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GO

    CREATE VIEW dbo.CtbVwiSProD
    WITH SCHEMABINDING
    AS
    SELECT COUNT_BIG (*) AS nQuaRegi, YEAR(dDatLanc) AS nNumAno, MONTH(dDatLanc) AS nNumMes, nCodContD AS nCodCont,
     nCodEmprD3 As nCodEmpr3, nCodAuxiD AS nCodProd, nCodCoPrD AS nCodCoPr, nCodLocaD AS nCodLoca,
     nCodRastD AS nCodRast, SUM(nVlrLanc) AS nVlrLanc, SUM(nQuaLancD) AS nQuaLanc
    FROM         dbo.CtbTblLCtb
    WHERE     (cDesAuxiD = 'PROD') AND (nCodAuxiD > 0)
    GROUP BY YEAR(dDatLanc), MONTH(dDatLanc), nCodContD, nCodEmprD3, nCodAuxiD, nCodCoPrD, nCodLocaD, nCodRastD

     

     

     

     

     

     

     

     

    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

    set ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS on
    GO

    set NUMERIC_ROUNDABORT off
    GO

     CREATE  UNIQUE  CLUSTERED  INDEX [PV_SProD] ON [dbo].[CtbVwiSProD]([nNumAno], [nNumMes], [nCodCont], [nCodEmpr3], [nCodProd], [nCodCoPr], [nCodLoca], [nCodRast]) ON [INDICES]
    GO

    set NUMERIC_ROUNDABORT off set arithabort  OFF
    GO

    SET QUOTED_IDENTIFIER OFF
     
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GO

    Create View Dbo.CtbVwiSdCcC With SchemaBinding As
    Select Count_Big(*) As nQuaRegi, nCodColi, Year(dDatCompC) As nNumAno,
     Month(dDatCompC) As nNumMes, nCodContC As nCodCont, nCodAuxiC As nCodAuxi,
     Sum(nVlrLanc) As nVlrLanc
    From Dbo.CtbTblLCtb
    Where cDesAuxiC = 'BANC'
      And nCodAuxiC > 0
      And dDatCompC Is Not Null
    Group By nCodColi, Year(dDatCompC), Month(dDatCompC), nCodContC, nCodAuxiC

     


    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

    set ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS on
    GO

    set NUMERIC_ROUNDABORT off
    GO

     CREATE  UNIQUE  CLUSTERED  INDEX [PV_SdCcC] ON [dbo].[CtbVwiSdCcC]([nCodColi], [nNumAno], [nNumMes], [nCodCont], [nCodAuxi]) ON [INDICES]
    GO

    set NUMERIC_ROUNDABORT off set arithabort  OFF
    GO

    SET QUOTED_IDENTIFIER OFF
     
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GO

    Create View Dbo.CtbVwiSdCcD With SchemaBinding As
    Select Count_Big(*) As nQuaRegi, nCodColi, Year(dDatCompD) As nNumAno,
     Month(dDatCompD) As nNumMes, nCodContD As nCodCont, nCodAuxiD As nCodAuxi,
     Sum(nVlrLanc) As nVlrLanc
    From Dbo.CtbTblLCtb
    Where cDesAuxiD = 'BANC'
      And nCodAuxiD > 0
      And dDatCompD Is Not Null
    Group By nCodColi, Year(dDatCompD), Month(dDatCompD), nCodContD, nCodAuxiD

     


    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

    set ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS on
    GO

    set NUMERIC_ROUNDABORT off
    GO

     CREATE  UNIQUE  CLUSTERED  INDEX [PV_SdCcD] ON [dbo].[CtbVwiSdCcD]([nCodColi], [nNumAno], [nNumMes], [nCodCont], [nCodAuxi]) ON [INDICES]
    GO

    set NUMERIC_ROUNDABORT off set arithabort  OFF
    GO

    SET QUOTED_IDENTIFIER OFF
     
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GO

    Create View Dbo.CtbVwiSdCtC With SchemaBinding As
    Select Count_Big(*) As nQuaRegi, cDesAuxiC As cDesAuxi, nCodColi, Year(dDatLanc) As nNumAno,
     Month(dDatLanc) As nNumMes, nCodContC As nCodCont, nCodEmprC3 As nCodEmpr3, nCodAuxiC As nCodAuxi,
     nCodCoPrC As nCodCoPr, Sum(nVlrLanc) As nVlrLanc, Sum(nQuaLancC) As nQuaLanc
    From Dbo.CtbTblLCtb
    Group By cDesAuxiC, nCodColi, Year(dDatLanc), Month(dDatLanc), nCodContC, nCodEmprC3, nCodAuxiC, nCodCoPrC

     

     

     

    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

    set ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS on
    GO

    set NUMERIC_ROUNDABORT off
    GO

     CREATE  UNIQUE  CLUSTERED  INDEX [PV_SdCtC] ON [dbo].[CtbVwiSdCtC]([cDesAuxi], [nCodColi], [nNumAno], [nNumMes], [nCodCont], [nCodEmpr3], [nCodAuxi], [nCodCoPr]) ON [INDICES]
    GO

    set NUMERIC_ROUNDABORT off set arithabort  OFF
    GO

    SET QUOTED_IDENTIFIER OFF
     
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GO

    Create View Dbo.CtbVwiSdCtD With SchemaBinding As
    Select Count_Big(*) As nQuaRegi, cDesAuxiD As cDesAuxi, nCodColi, Year(dDatLanc) As nNumAno,
     Month(dDatLanc) As nNumMes, nCodContD As nCodCont, nCodEmprD3 As nCodEmpr3, nCodAuxiD As nCodAuxi,
     nCodCoPrD As nCodCoPr, Sum(nVlrLanc) As nVlrLanc, Sum(nQuaLancD) As nQuaLanc
    From Dbo.CtbTblLCtb
    Group By cDesAuxiD, nCodColi, Year(dDatLanc), Month(dDatLanc), nCodContD, nCodEmprD3, nCodAuxiD, nCodCoPrD

     

     

     

    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

    set ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS on
    GO

    set NUMERIC_ROUNDABORT off
    GO

     CREATE  UNIQUE  CLUSTERED  INDEX [PV_SdCtD] ON [dbo].[CtbVwiSdCtD]([cDesAuxi], [nCodColi], [nNumAno], [nNumMes], [nCodCont], [nCodEmpr3], [nCodAuxi], [nCodCoPr]) ON [INDICES]
    GO

    set NUMERIC_ROUNDABORT off set arithabort  OFF
    GO

    SET QUOTED_IDENTIFIER OFF
     
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GO

    Create View Dbo.CtbVwiSdSoC With SchemaBinding As
    Select Count_Big(*) As nQuaRegi, Dbo.CtbTblLCtb.nCodColi, Year(Dbo.CtbTblLCtb.dDatLanc) As nNumAno,
     Month(Dbo.CtbTblLCtb.dDatLanc) As nNumMes, Dbo.CtbTblLCtb.nCodContC As nCodCont,
     Dbo.CtbTblLCtb.nCodEmprC3 As nCodEmpr3, Dbo.CtbTblLCtb.nCodAuxiC As nCodAuxi,
     Dbo.CtbTblLCtb.nCodCoPrC As nCodCoPr, Dbo.CtbTblLSor.nCodSortC As nCodSort,
     Dbo.CtbTblLSor.nCodLocaC As nCodLoca, Dbo.CtbTblLSor.cCodRastC As cCodRast,
     Sum(Dbo.CtbTblLSor.nQuaLancC) As nQuaLanc, Sum(Dbo.CtbTblLSor.nQcvLancC) As nQcvLanc
    From Dbo.CtbTblLCtb
     Inner Join Dbo.CtbTblLSor On
      Dbo.CtbTblLCtb.nIdeLCtb = Dbo.CtbTblLSor.nIdeLCtb
    Where Dbo.CtbTblLCtb.cDesAuxiC = 'PROD'
      And Dbo.CtbTblLCtb.nCodAuxiC > 0
    Group By Dbo.CtbTblLCtb.nCodColi, Year(Dbo.CtbTblLCtb.dDatLanc),
     Month(Dbo.CtbTblLCtb.dDatLanc), Dbo.CtbTblLCtb.nCodContC, Dbo.CtbTblLCtb.nCodEmprC3, Dbo.CtbTblLCtb.nCodAuxiC,
     Dbo.CtbTblLCtb.nCodCoPrC, Dbo.CtbTblLSor.nCodSortC, Dbo.CtbTblLSor.nCodLocaC, Dbo.CtbTblLSor.cCodRastC

     

     

     

    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

    set ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS on
    GO

    set NUMERIC_ROUNDABORT off
    GO

     CREATE  UNIQUE  CLUSTERED  INDEX [PV_SdSoC] ON [dbo].[CtbVwiSdSoC]([nCodColi], [nNumAno], [nNumMes], [nCodCont], [nCodEmpr3], [nCodAuxi], [nCodCoPr], [nCodSort], [nCodLoca], [cCodRast]) ON [INDICES]
    GO

    set NUMERIC_ROUNDABORT off set arithabort  OFF
    GO

    SET QUOTED_IDENTIFIER OFF
     
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GO

    Create View Dbo.CtbVwiSdSoD With SchemaBinding As
    Select Count_Big(*) As nQuaRegi, Dbo.CtbTblLCtb.nCodColi, Year(Dbo.CtbTblLCtb.dDatLanc) As nNumAno,
     Month(Dbo.CtbTblLCtb.dDatLanc) As nNumMes, Dbo.CtbTblLCtb.nCodContD As nCodCont,
     Dbo.CtbTblLCtb.nCodEmprD3 As nCodEmpr3, Dbo.CtbTblLCtb.nCodAuxiD As nCodAuxi,
     Dbo.CtbTblLCtb.nCodCoPrD As nCodCoPr, Dbo.CtbTblLSor.nCodSortD As nCodSort,
     Dbo.CtbTblLSor.nCodLocaD As nCodLoca, Dbo.CtbTblLSor.cCodRastD As cCodRast,
     Sum(Dbo.CtbTblLSor.nQuaLancD) As nQuaLanc, Sum(Dbo.CtbTblLSor.nQcvLancD) As nQcvLanc
    From Dbo.CtbTblLCtb
     Inner Join Dbo.CtbTblLSor On
      Dbo.CtbTblLCtb.nIdeLCtb = Dbo.CtbTblLSor.nIdeLCtb
    Where Dbo.CtbTblLCtb.cDesAuxiD = 'PROD'
      And Dbo.CtbTblLCtb.nCodAuxiD > 0
    Group By Dbo.CtbTblLCtb.nCodColi, Year(Dbo.CtbTblLCtb.dDatLanc), Month(Dbo.CtbTblLCtb.dDatLanc),
     Dbo.CtbTblLCtb.nCodContD, Dbo.CtbTblLCtb.nCodEmprD3, Dbo.CtbTblLCtb.nCodAuxiD, Dbo.CtbTblLCtb.nCodCoPrD,
     Dbo.CtbTblLSor.nCodSortD, Dbo.CtbTblLSor.nCodLocaD, Dbo.CtbTblLSor.cCodRastD

     


    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

    set ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS on
    GO

    set NUMERIC_ROUNDABORT off
    GO

     CREATE  UNIQUE  CLUSTERED  INDEX [PV_SdSoD] ON [dbo].[CtbVwiSdSoD]([nCodColi], [nNumAno], [nNumMes], [nCodCont], [nCodEmpr3], [nCodAuxi], [nCodCoPr], [nCodSort], [nCodLoca], [cCodRast]) ON [INDICES]
    GO

    set NUMERIC_ROUNDABORT off set arithabort  OFF
    GO

    SET QUOTED_IDENTIFIER OFF
     
    SET ANSI_NULLS ON
    GO

     

     

    OBSERVE.. Que existe varios 'GO', não seria muito prático, nesta ocasião dividir ele em varios pedassos abrir e fechar a conexão sendo que a lentidão iria aumentar e não sei se iria funcionar!

     

    Agradeço pela atenção!

     

    Obrigado..

     

    Vinicius Oliveira Marra

     

     

     

    domingo, 3 de fevereiro de 2008 14:26
  •  

    Vinícius,

     

    Funcionar vai. E o tempo de execução será apenas um pouco maior que o tempo para executar diretamente o SQL. Sobre o que você disse, não é preciso abrir e fechar a conexão a cada execução, pode ser uma conexão apenas e apenas fazer várias execuções.

     

    Para definir o que será executado, poderá usar algo como um Array dentro do C#, separando as string a partir do GO.

     

    Tente aí, vai funcionar perfeitamente.

     

     

    Abraço!!!

    domingo, 3 de fevereiro de 2008 18:38
  • O problema é a palavra "GO".

    O "GO" não é SQL , é reconhecido pelo Query Analyser como um comando. O execute do C# só reconhece sintaxe SQL.

     

    Se vc, antes de executar o script, dar um replace removendo todos os "GO" o script será rodado sem problemas.

     

    Espero ter ajudado.

     

     

     

     

    quinta-feira, 7 de fevereiro de 2008 01:16
  •  

    alleolli,

     

    Não é tão simples assim. Existem instruções que não podem ser executadas em conjunto (no mesmo lote), faça um teste rodando o seguinte script, todo ele:

     

    Code Snippet

    -- inicio da primeira view

    create view dbo.V1

    as

    select * from teste

    -- fim da primeira view

    -- inicio da segunda view

    create view dbo.V2

    as

    select * from teste

    -- fim da segunda view

     

     

     

    Vai dar erro. Por isso dei a idéia de quebrar o script em vários usando como separador o GO.

     

    Abraço!!!

    quinta-feira, 7 de fevereiro de 2008 04:15
  •  

    Olá Pessoal

     

    eu Fiz uma Forma de Executar um Script Por Blocos Mesmo que ele Tenha 'GO'

    Dessa Forma podemos Executar Um Script Gerado Pelo 'SQL Manager for SQL Server' Sem Problemas

     

    Exemplo de Script: ("C:\Banco.sql")

    Code Snippet

    CREATE TABLE [dbo].[credito] (
      [id_credito]int IDENTITY(1, 1) NOT NULL,
      [id_nota_fiscal]int NULL,
      [id_centro]int NULL,
      [dt_movimento]datetime NULL,
      [dt_vencimento]datetime NULL,
      [dt_pagamento]datetime NULL,
      [descricao]varchar(100) COLLATE Latin1_General_CI_AS NULL,
      [valor]decimal(18, 2) NULL,
      [valor_pago]decimal(18, 2) NULL,
      [status]varchar(25) COLLATE Latin1_General_CI_AS NULL,
      [parcela]int NULL,
      [id_cliente]int NULL
    )
    ON [PRIMARY]
    GO

    --
    -- Definition for table debito :
    --

    CREATE TABLE [dbo].[debito] (
      [id_debito]int IDENTITY(1, 1) NOT NULL,
      [id_nota_fiscal]int NULL,
      [id_centro]int NULL,
      [id_fornecedor]int NULL,
      [dt_movimento]datetime NULL,
      [dt_vencimento]datetime NULL,
      [dt_pagamento]datetime NULL,
      [descricao]varchar(100) COLLATE Latin1_General_CI_AS NULL,
      [valor]decimal(18, 2) NULL,
      [valor_pago]decimal(18, 2) NULL,
      [status]varchar(25) COLLATE Latin1_General_CI_AS NULL,
      [parcela]int NULL
    )
    ON [PRIMARY]
    GO

     

     

    Solucão Para Executar, Pode Ter Views SP

    Code Snippet

    Sub ExecutaSql(ByVal path As String)

    If AbreCon() = False Then

    Exit Sub

    End If

    Try

    Dim sr As IO.StreamReader = IO.File.OpenText(path)

    Dim Bloco As String = String.Empty

    Dim Linha As String = String.Empty

    Dim cmd As SqlCommand = CN.CreateCommand

    cmd.CommandType = CommandType.Text

     

    Try

    cmd.CommandText = "USE [" & Me.cbBanco.Text & "]"

    cmd.ExecuteNonQuery()

    Catch ex As Exception

    MessageBox.Show("Erro ao Selecionar o Banco de Dados!")

    Exit Sub

    End Try

     

    While Linha IsNot Nothing

    Linha = sr.ReadLine

    If Linha <> "GO" Then

    Bloco = Bloco & ControlChars.NewLine & Linha

    Else

    If Bloco <> "" Then

    cmd.CommandText = Bloco

    Try

    cmd.ExecuteNonQuery()

    Catch ex As Exception

    MessageBox.Show("Erro ao executar o Seguinte Bloco de Comandos:" & ControlChars.NewLine & Bloco & ControlChars.NewLine & ex.Message)

    End Try

    Bloco = String.Empty

    End If

    End If

    End While

     

    Catch ex As Exception

    MessageBox.Show("Erro ao Criar o Banco de Dados!" & ControlChars.NewLine & ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)

    End Try

     

    End Sub

     

     

    use asssim

    ExecutaSql("C:\Banco.sql")

    sexta-feira, 22 de fevereiro de 2008 20:11