Usuário com melhor resposta
View com variavel

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
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
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.brSe 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.
- Editado Roberson Ferreira _Moderator terça-feira, 28 de agosto de 2012 12:42
- Sugerido como Resposta Roberson Ferreira _Moderator terça-feira, 28 de agosto de 2012 17:36
-
-
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! -
-
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.brSe 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. -
-
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- Editado _Juliano_Alves_ terça-feira, 28 de agosto de 2012 13:25
- Sugerido como Resposta Roberson Ferreira _Moderator terça-feira, 28 de agosto de 2012 17:36
-
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
-
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)
-
-
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
-
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.brSe 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. -
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 = 178886SELECT @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/gmasqlClassifique as respostas. O seu feedback é imprescindível
-
-
Favor marcar como "Resposta" os posts considerados como resposta. Obrigado.
Roberson Ferreira - Database Developer
Acesse: www.robersonferreira.com.br
Email: contato@robersonferreira.com.brSe 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