2009-02-27 24 views
4

parametre değerleri geçmesine nasıl girdi parametresi geçirmek için nasıl emin değilimSQL server 2005 (Management Studio IDE) aşağıdaki T-SQL sorgusu kullanıyorum bir T-SQL sorgusu

DECLARE @id int; 
DECLARE @countVal int; 
DECLARE @sql nvarchar(max); 
SET @id = 1000; 
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = @id'; 
EXEC (@sql) AT oracleServer -- oracleServer is a lined server to Oracle 

EXEC sorgusuna @id ve sayma sonucunu @countVal'e iletin. Ben gibi Microsoft SQL sunucusu için bazı örnekler gördük: Ben Oracle için bu denedi

EXEC (@sql, @id = @id) 

ama deyim hata var:

OLE DB provider "OraOLEDB.Oracle" for linked server "oracleServer" 
returned message "ORA-00936: missing expression" 

cevap

14

bu deneyin yapabilirdi:

EXEC sp_executesql @sql, N'@id int', @id 
bu büyük makalesine

diğer bilgiler: çıktısı gelince http://www.sommarskog.se/dynamic_sql.html


, sizin SEÇ ihtiyaçlar şunun gibi görün:

0 Bunun yerine gereksiz verileri çekerek önlemek için '*' ait 'kimlik' seçerek ediyorum
SELECT @countVal = COUNT(id) FROM owner.myTable WHERE id = @id 

...

Sonra dinamik sql böyle bir şey olmalı: Bu örnek uyarlanmıştır

EXEC sp_executesql @sql, 
        N'@id int, @countVal int OUTPUT', 
        @id, 
        @countVal OUTPUT 

Yukarıdaki aynı makaleden, bölüm sp_executesql.


Oracle hatası gelince, Oracle için gönderiyor Sp_executesql tam SQL öğrenmek gerekecektir. Oracle'da bir profiler veya sorgu günlüğü varsa, bu yardımcı olabilir. Oracle ile sınırlı deneyimim var, ancak sorununuzu gidermek için bir sonraki mantıklı adım olacaktır.

+0

EXEC() örneği, Oracle ile çalışmıyor, çok üzgün. Sql'de parametreler yoksa, düzgün çalışır. SQL için çıkış parametresi ile Oracle db için geçiş sorgusu kullanma konusunda hiçbir fikrim yok. –

+0

SET @sql = 'seçin? = owner.mytable'dan (*) sayın; exec (@sql, @countVal çıkışı) oracleServer - Oracle davasının başarısızlığı –

+0

Bu yaklaşımdaki sorun, bir geçici tablo oluşturmadan sonuç kümesini başka bir Depolanmış Prosedür ... içinden iade edememenizdir (uygun değil dinamik bir sorgu ile) ... bunu yapan bir işlev yok mu? –

0

ayrı geçiş id neden bilmiyorum.

Aşağıdaki
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + @id

+0

Girdi parametresi bu şekilde iyi ama sonuç ne olacak? –

0

Hızlı ve kirli yol, EXEC bildirimini kullanmadan önce dizeyi oluşturmaktır, ancak bu, SQL Injection'a açabileceğiniz için önerilen uygulama değildir.

DECLARE @id int; 
DECLARE @countVal int; 
DECLARE @sql nvarchar(max); 
SET @id = 1000; 
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + @id 
EXEC (@sql) AT oracleServer -- oracleServer is a lined server to Oracle 

Bunu yapmanın doğru yolu magnifico tarafından ayrıntılı ve Books Online'da Microsoft tarafından önerilen olduğu gibi sistem saklı yordamı sp_executesql kullanmaktır:,

EXEC sp_executesql @sql, N'@id int', @id