2011-05-24 39 views

cevap

43

Siz haklısınız. Yerel değişkenlere bir GÖRÜNÜM'de izin verilmez.

Bir sonuç kümesi döndüren bir tablo değerli fonksiyonu yerel bir değişken, set (a görünüşüdür yaptığı gibi.)

http://msdn.microsoft.com/en-us/library/ms191165.aspx

ör

CREATE FUNCTION dbo.udf_foo() 
RETURNS @ret TABLE (col INT) 
AS 
BEGIN 
    DECLARE @myvar INT; 
    SELECT @myvar = 1; 
    INSERT INTO @ret SELECT @myvar; 
    RETURN; 
END; 
GO 
SELECT * FROM dbo.udf_foo(); 
GO 
+4

İşleri nasıl bu kadar korkunç yaparlar? Bazen sadece Microsoft Sertifikalandırılabilir Profesyonelleri işe aldıklarını düşünüyorum. –

+1

Ben bir kullanıcı kavramını yenen ve bu sertifikasyon için sizi bekleyen bir çanta konsepti ile değiştiren bir kurgu olduğunu hayal ediyorum – user1566694

3

Evet bu doğrudur, sen görünümler değişkenleri olamaz (diğer kısıtlamalar da vardır).

Görüntüleme sonuç bir select deyimi ile değiştirilebilir durumlar için kullanılabilir.

+0

bir tablo işlevi seçkin bir açıklamada değiştirilebilir ve üzeri

da
CREATE VIEW vwImportant_Users AS WITH params AS ( SELECT varType='%Admin%', varMinStatus=1) SELECT status, name FROM sys.sysusers, params WHERE status > varMinStatus OR name LIKE varType SELECT * FROM vwImportant_Users 

da

WITH params AS (SELECT varType='%Admin%', varMinStatus=1) SELECT status, name FROM sys.sysusers INNER JOIN params ON 1=1 WHERE status > varMinStatus OR name LIKE varType 

JOIN aracılığıyla: Burada değişkenin isimleri önbelleğe CTE kullanan bir çalışma örneği yerel değişkenlere sahiptir. – JeffO

+0

@JeffO - işaret ettiğinden emin değilsiniz. – Hogan

+0

Seçme ifadesi yerel değişkenlere sahip olamayacağından beri bir görüş belirtebilir misiniz? – JeffO

13

DÜZENLEME: Ben @bummi tarafından belirttiği gibi, yanlış benim önceki cevap üzerine bir CTE kullanarak çalıştı. Bu seçenek yerine çalışmalıdır:

SELECT st.Value, Constants.CONSTANT_ONE, Constants.CONSTANT_TWO 
FROM SomeTable st 
CROSS APPLY (
    SELECT 'Value1' AS CONSTANT_ONE, 
      'Value2' AS CONSTANT_TWO 
) Constants 
+0

Düzeltme için teşekkürler - bunun yerine CROSS UYGULAMASI'nı kullanmak için güncellendi. –

+0

Bu çalışır, ancak Çapraz Uygulamanın sütunları her satır için yeniden başlatılmıyor mu? Özellikle hesaplanan değerler için büyük bir performans kaybı anlamına gelir. Yerel Değişken ve CTE'nin bir Görünümde mevcut olmaması çok üzücü, kimse fikrini neden? –

1

Ne yapmam tablo değişkeni olarak ve aynı seçme gerçekleştiren bir görünüm oluşturmak geçerli:

İşte bu soruna işin türüne, GEÇERLİ bir ÇAPRAZ kullanarak tek seçenek Bu görünümü ikinci görünüme bağla. Böylece bir görünüm başka bir görünümden seçebilir. sözü spencer7593 dinamik veriler için doğru bir yaklaşımdır gibi bu işlevlerini kullanma aynı sonucu

+1

Ben, bu çok küçük tablolar ile uğraşmadıkça bir performans sorununa neden olabilir. – logixologist

0

ulaşır. Statik veriler için, SQL veri tasarımı ile tutarlı olan daha performanslı bir yaklaşım (sprocs'taki masif prosedürel kodun anti-desenine karşı), statik değerlerle ayrı bir tablo oluşturmak ve ona katılmaktır. Bu, SQL Engine bir JOIN etrafında etkili yürütme planları oluşturabildiğinden ve gerektiğinde dizin ekleme potansiyeline sahip olduğunuzdan, bu bir performans perspektifinden son derece faydalıdır.

fonksiyonları kullanmanın dezavantajı (veya herhangi bir satır içi hesaplanmış değerler) ek bilgi masraflı olan, dönen her potansiyel satır için tekrarlanır. Niye ya? Çünkü SQL ilk önce hesaplanan değerlerle tam bir veri kümesi oluşturmalı ve ardından WHERE yan tümcesini bu veri kümesine uygulamalıdır.

dokuzu on üzerinden size sorgularda dinamik hesaplanan hücre değerlerini gerekmez. İhtiyacınız olan şeyi anlayabilmek için çok daha iyi, daha sonra bunu destekleyen bir veri modeli tasarlayın ve bu veri modelini yarı dinamik verisiyle doldurun (örneğin toplu iş yoluyla) ve ağır yükü kaldırmak için SQL Engine'i kullanın. standart SQL

15

Sen ifadelerini tanımlamak için İLE kullanabilirsiniz. Daha sonra bu tanımlara erişmek için basit bir Alt-SELECT yapın.

CREATE VIEW MyView 
AS 
    WITH MyVars (SomeVar, Var2) 
    AS (
    SELECT 
     'something' AS 'SomeVar', 
     123 AS 'Var2' 
) 

    SELECT * 
    FROM MyTable 
    WHERE x = (SELECT SomeVar FROM MyVars) 
0

@datenstation doğru konsepti vardı.CROSS APPLY

WITH params AS (SELECT varType='%Admin%', varMinStatus=1) 
SELECT status, name 
    FROM sys.sysusers CROSS APPLY params 
    WHERE status > varMinStatus OR name LIKE varType