none
View com variavel RRS feed

  • Pergunta

  • É possivel utilizar declare em uma view ???

    Ex.:

    ALTER VIEW VW_REL_RNC AS 
    DECLARE @TEXTO VARCHAR(8000);
    DECLARE @Y VARCHAR(8000);
    DECLARE @TEXTO2 VARCHAR(8000);
    DECLARE @Z VARCHAR(8000);
    DECLARE C_CRON CURSOR FOR
    SELECT YP_TEXTO FROM SYP010 SYP
    WHERE YP_CHAVE = 178886
    OPEN C_CRON;
    SET @TEXTO = ''
    FETCH NEXT FROM C_CRON INTO @Y;
    WHILE @@FETCH_STATUS = 0
    BEGIN SET @TEXTO = @TEXTO + RTRIM(LTRIM(@Y));
    FETCH NEXT FROM C_CRON INTO @Y;
    END
    CLOSE C_CRON;
    DEALLOCATE C_CRON;

    SELECT @TEXTO



    hdk

    terça-feira, 28 de agosto de 2012 12:19

Respostas

  • Altere a função para a seguinte...

    ALTER FUNCTION FN_REL_RNC(
    	@YP_CHAVE INT
    ) RETURNS VARCHAR(MAX)
    AS BEGIN
    	DECLARE @T TABLE (
    		ID	INT IDENTITY(1,1) PRIMARY KEY
    		,Y	VARCHAR(MAX)
    	)
    	--
    	INSERT @T
    	SELECT	YP_TEXTO
    	FROM	SYP010 SYP 
    	WHERE	YP_CHAVE = 178886
    	--
    	DECLARE	@ID		INT
    			,@IDMAX	INT
    			,@TEXTO	VARCHAR(MAX)
    	--
    	SELECT	@IDMAX = MAX(ID), @ID = MIN(ID)
    	FROM	@T
    	--
    	WHILE @ID <= @IDMAX BEGIN
    		
    		SET	@TEXTO = (SELECT ISNULL(@TEXTO, '') + Y FROM @T WHERE ID = @ID)
    		--
    		SET @ID = @ID + 1
    	END
    	--
    	RETURN @TEXTO	
    END



    • Editado _Juliano_Alves_ terça-feira, 28 de agosto de 2012 13:42
    • Marcado como Resposta Harley D.K. _ terça-feira, 28 de agosto de 2012 19:36
    terça-feira, 28 de agosto de 2012 13:41

Todas as Respostas

  • Não. A View nada mais é do que um (ou mais) Select(s) preparados de ante-mão. Somente Selects são permitidos, sem grandes variações.

    Tem um link legal sobre isso: http://www.devmedia.com.br/introducao-a-views/1614


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.


    terça-feira, 28 de agosto de 2012 12:41
    Moderador
  • Não, porém você pode criar uma function que retorne uma tabela, dessa forma você pode fazer o select na function, inclusive podendo utilizá-la em joins.

    Abçs

    terça-feira, 28 de agosto de 2012 12:43
  • Não, porém você pode criar uma function que retorne uma tabela, dessa forma você pode fazer o select na function, inclusive podendo utilizá-la em joins.

    Abçs


    ...mas, analisando melhor o objetivo da view que postou, uma função escalar já resolveria!
    terça-feira, 28 de agosto de 2012 12:47
  • O resultado do codigo que passei eu uso em um select com uma tabela.

    A ideia era gerar um relatorio com CRYSTAL utilizando a view.


    hdk

    terça-feira, 28 de agosto de 2012 12:55
  • Só que a sintaxe de uma View no SQL Server é a seguinte:

    CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ] 
    [ WITH <view_attribute> [ ,...n ] ] 
    AS select_statement

    Uma View só pode ter Selects (encapsulados ou não).


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 28 de agosto de 2012 13:02
    Moderador
  • Qual seria o filtro passado para a view?
    terça-feira, 28 de agosto de 2012 13:02
  • Harley, tenta assim...
    -- CRIAÇÃO SCALAR FUNCTION
    CREATE FUNCTION FN_REL_RNC(
    	@YP_CHAVE INT
    ) RETURNS VARCHAR
    AS BEGIN
    	DECLARE @T TABLE (
    		ID	INT IDENTITY(1,1) PRIMARY KEY
    		,Y	VARCHAR(MAX)
    	)
    	--
    	INSERT @T
    	SELECT	YP_TEXTO
    	FROM	SYP010 SYP 
    	WHERE	YP_CHAVE = @YP_CHAVE
    	--
    	DECLARE	@ID		INT
    			,@IDMAX	INT
    			,@TEXTO	VARCHAR(MAX)
    	--
    	SELECT	@IDMAX = MAX(ID)
    ,@ID = MIN(ID)	FROM	@T
    	--
    	WHILE @ID <= @IDMAX BEGIN
    		SET	@TEXTO = (SELECT ISNULL(@TEXTO, '') + Y FROM @T WHERE ID = @ID)
    		--
    		SET @ID = @ID + 1
    	END
    	--
    	RETURN @TEXTO	
    END
    
    -- USO SCALAR FUNCTION
    SELECT FN_REL_RNC(178886)

    Abçs
    terça-feira, 28 de agosto de 2012 13:22
  • QUANDO EXECUTO APARECE ESSE ERRO:

    Mensagem 156, Nvel 15, Estado 1, Procedimento FN_REL_RNC, Linha 33

    Incorrect syntax near the keyword 'SELECT'.

    Mensagem 195, Nvel 15, Estado 10, Procedimento FN_REL_RNC, Linha 33

    'FN_REL_RNC' is not a recognized function name.


    hdk

    terça-feira, 28 de agosto de 2012 13:31
  • QUANDO EXECUTO APARECE ESSE ERRO:

    Mensagem 156, Nvel 15, Estado 1, Procedimento FN_REL_RNC, Linha 33

    Incorrect syntax near the keyword 'SELECT'.

    Mensagem 195, Nvel 15, Estado 10, Procedimento FN_REL_RNC, Linha 33

    'FN_REL_RNC' is not a recognized function name.


    hdk


    Tenta...
    SELECT dbo.FN_REL_RNC(178886)

    terça-feira, 28 de agosto de 2012 13:35
  • Mensagem 156, Nvel 15, Estado 1, Procedimento FN_REL_RNC, Linha 33

    Incorrect syntax near the keyword 'SELECT'.


    hdk

    terça-feira, 28 de agosto de 2012 13:41
  • Altere a função para a seguinte...

    ALTER FUNCTION FN_REL_RNC(
    	@YP_CHAVE INT
    ) RETURNS VARCHAR(MAX)
    AS BEGIN
    	DECLARE @T TABLE (
    		ID	INT IDENTITY(1,1) PRIMARY KEY
    		,Y	VARCHAR(MAX)
    	)
    	--
    	INSERT @T
    	SELECT	YP_TEXTO
    	FROM	SYP010 SYP 
    	WHERE	YP_CHAVE = 178886
    	--
    	DECLARE	@ID		INT
    			,@IDMAX	INT
    			,@TEXTO	VARCHAR(MAX)
    	--
    	SELECT	@IDMAX = MAX(ID), @ID = MIN(ID)
    	FROM	@T
    	--
    	WHILE @ID <= @IDMAX BEGIN
    		
    		SET	@TEXTO = (SELECT ISNULL(@TEXTO, '') + Y FROM @T WHERE ID = @ID)
    		--
    		SET @ID = @ID + 1
    	END
    	--
    	RETURN @TEXTO	
    END



    • Editado _Juliano_Alves_ terça-feira, 28 de agosto de 2012 13:42
    • Marcado como Resposta Harley D.K. _ terça-feira, 28 de agosto de 2012 19:36
    terça-feira, 28 de agosto de 2012 13:41
  • Na verdade o erro anterior deu porque para acionar uma function é necessário explicitar o schema do qual ela faz parte. Se você estiver logado como sa provavelmente ela foi criado para o dbo.

    SELECT dbo.FN_REL_RNC(178886)


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    terça-feira, 28 de agosto de 2012 13:47
    Moderador
  • Bom Dia,

    Ao invés de tentar colocar o seu código em uma view ou em um UDF, eu sugiro sinceramente que você reescreva a consulta antes de fazê-lo. Esse cursor só lhe trará problemas e há como fazer uma consulta dessas de forma muito mais enxuta e performática.

    DECLARE @Y VARCHAR(8000)
    SET @Y = ''
    SELECT @Y = YP_TEXTO + '' FROM SYP010 SYP
    WHERE YP_CHAVE = 178886

    SELECT @Y

    Existem ainda outras soluções eficientes. Procure no fórum pelo termo "Concatenar" ou "Concatenar e Agrupar Registros"

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    terça-feira, 28 de agosto de 2012 14:09
  • Consegui fazer utilizando Function

    Valeu pelo apoio


    hdk

    terça-feira, 28 de agosto de 2012 17:29
  • Favor marcar como "Resposta" os posts considerados como resposta. Obrigado.

    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta Harley D.K. _ terça-feira, 28 de agosto de 2012 19:36
    • Não Marcado como Resposta Harley D.K. _ terça-feira, 28 de agosto de 2012 19:36
    terça-feira, 28 de agosto de 2012 17:37
    Moderador