2009-05-27 17 views

Odpowiedz

20

Ta konstrukcja nie jest dozwolony w SQL Server. Inline funkcja o wartości tabelarycznej może działać jako sparametryzowany widok, ale nadal nie może wywoływać takiego SP.

Oto kilka przykładów używania SP i wbudowanego TVF wymiennie - zobaczysz, że TVF jest bardziej elastyczny (w zasadzie bardziej przypomina widok niż funkcję), więc jeśli można użyć wbudowanej TVF, mogą one być bardziej re-eusable:

CREATE TABLE dbo.so916784 (
    num int 
) 
GO 

INSERT INTO dbo.so916784 VALUES (0) 
INSERT INTO dbo.so916784 VALUES (1) 
INSERT INTO dbo.so916784 VALUES (2) 
INSERT INTO dbo.so916784 VALUES (3) 
INSERT INTO dbo.so916784 VALUES (4) 
INSERT INTO dbo.so916784 VALUES (5) 
INSERT INTO dbo.so916784 VALUES (6) 
INSERT INTO dbo.so916784 VALUES (7) 
INSERT INTO dbo.so916784 VALUES (8) 
INSERT INTO dbo.so916784 VALUES (9) 
GO 

CREATE PROCEDURE dbo.usp_so916784 @mod AS int 
AS 
BEGIN 
    SELECT * 
    FROM dbo.so916784 
    WHERE num % @mod = 0 
END 
GO 

CREATE FUNCTION dbo.tvf_so916784 (@mod AS int) 
RETURNS TABLE 
    AS 
RETURN 
    (
    SELECT * 
    FROM dbo.so916784 
    WHERE num % @mod = 0 
    ) 
GO  

EXEC dbo.usp_so916784 3 
EXEC dbo.usp_so916784 4 

SELECT * FROM dbo.tvf_so916784(3)  
SELECT * FROM dbo.tvf_so916784(4) 

DROP FUNCTION dbo.tvf_so916784 
DROP PROCEDURE dbo.usp_so916784 
DROP TABLE dbo.so916784 
1

Musisz napisać scenariusz widoku jak poniżej. Zasadniczo zapiszesz wyniki swojego procesu do tabeli var lub temp table, a następnie wybierz do widoku.

Edit - Jeśli można zmienić procedurę przechowywaną do funkcji Wartość stołowy, byłoby wyeliminować etap selekcji do tabeli temp.

** Edytuj 2 ** - Komentarze są poprawne, że sproc nie może zostać odczytany w widoku, który sugerowałem. Zamiast zamienić proc do funkcji tabeli wartości jak wspomniano w innych postach i wybierz z tego:

create view sampleView 
as select field1, field2, ... 
from dbo.MyTableValueFunction 

Przepraszam za zamieszanie

+0

Jestem prawie pewien, że nie można tego zrobić w SQL Server. –

+0

Właściwie, jestem pewien, że nie możesz tego zrobić, ponieważ poglądy nie mogą mieć bloków BEGIN END w pierwszej kolejności. –

+0

Masz rację ... inwestujesz. Wiem, że wcześniej zaludniłem poglądy w podobny sposób. –

2

Jeśli używasz SQL Server 2005 można użyć funkcji tabeli wyceniane . Możesz wywoływać je bezpośrednio i przekazywać parametry, traktując je jak tabele.

Aby uzyskać więcej informacji sprawdź Table-Valued User-Defined Functions

+0

Wygląda na to, że funkcje z wartościami tabel są również dostępne w SQL Server 2000: http://www.devarticles.com/c/a/SQL-Server/Ustawianie-User- Defined-Functions-In-SQL-Server- 2000/4/ – polara

0
create view sampleView as 
select field1, field2, ... 
from dbo.MyTableValueFunction 

Należy pamiętać, że nawet jeśli MyTableValueFunction nie przyjmuje żadnych parametrów, trzeba jeszcze zawierać nawiasy po nim, czyli:

... from dbo.MyTableValueFunction() 

Bez nawiasów otrzymasz komunikat o błędzie "Nieprawidłowy obiekt".

16
exec sp_addlinkedserver 
     @server = 'local', 
     @srvproduct = '', 
     @provider='SQLNCLI', 
     @datasrc = @@SERVERNAME 
go 

create view ViewTest 
as 
select * from openquery(local, 'sp_who') 
go 

select * from ViewTest 
go 
+0

Próbowałem tego, ale gdy próbuję uruchomić wybierz * z openquery, to mówi mi: Dostawca OLE DB "SQLNCLI11" dla serwera połączonego "lokalny" zwrócił komunikat "Limit czasu logowania wygasł". –

4

Udało mi się wywołać procedurę przechowywaną w widoku (SQL Server 2005).

CREATE FUNCTION [dbo].[dimMeasure] 
    RETURNS TABLE AS 

    (
    SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost; Trusted_Connection=yes;', 'exec ceaw.dbo.sp_dimMeasure2') 
    ) 
RETURN 
GO 

Wewnątrz procedury przechowywanej musimy ustawić:

set nocount on 
SET FMTONLY OFF 
CREATE VIEW [dbo].[dimMeasure] 
AS 

SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'exec ceaw.dbo.sp_dimMeasure2') 

GO 
-3
CREATE VIEW [dbo].[dimMeasure] 
AS 

SELECT * FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;' 
         , 'exec ceaw.dbo.sp_dimMeasure2') 

GO 
+3

Zamiast zamieszczać inną odpowiedź z drugą połową odpowiedzi, a może chcesz edytować poprzednią, aby zawierała wszystko, co chcesz? (Co zrobiłem dla ciebie, sprawdź, czy zrobiłem to poprawnie.) Teraz proszę usuń to, chyba że naprawdę zamierzałeś dwie różne odpowiedzi na to samo pytanie. –

Powiązane problemy