Не могу ли я использовать "DECLARE" в табличной функции? - PullRequest
2 голосов
/ 21 июля 2009

Спасибо за ваше сообщение, я решил мою проблему следующим образом

ALTER FUNCTION [VEZNE].[fnMakbuzIslemGetir] 
        ( 
              @refNo     as int      
        ) 

RETURNS @tablename TABLE (kontrol1 char(1),key0 numeric(18,0) ,tarih datetime ,hizkod char(12),hizad char(75),ytlhizfiyat decimal(18,2) ,hizmiktar numeric(18,2),ytlhiztutar decimal(18,2))
        AS 
        BEGIN

            DECLARE @durum     AS VARCHAR
            DECLARE @hastaTuru AS VARCHAR 
            DECLARE @makTipi   AS VARCHAR 

            SET @durum     = (SELECT durum FROM TH_RefKart WHERE RefNo = @refNo)
            SET @hastaturu = (SELECT HastaTuru FROM TH_Dosya WHERE DosyaNo in (SELECT DosyaNo FROM TH_RefKart WHERE RefNo = @refNo))
            SET @makTipi   = (SELECT maktipi FROM TH_Islem WHERE refNo = @refNo )

            IF ((@hastaTuru = 'Ücretli') AND (@durum = 'AYAKTA')) OR @makTipi = '0' 
            BEGIN 
                INSERT @tablename SELECT kontrol1, key0, tarih, hizkod, hizad, ytlhizfiyat, hizmiktar, ytlhiztutar 
                FROM TH_Islem 
                WHERE refno= @refNo and DekontNo = '0' and anahtar<> -1 
            END 

        RETURN

        END

но теперь у меня есть другая проблема в этом ряду

SET @makTipi   = (SELECT maktipi FROM TH_Islem WHERE refNo = @refNo)

потому что этот SELECT возвращает значение из нескольких строк. что я могу сделать сейчас?

Ответы [ 2 ]

3 голосов
/ 21 июля 2009

Попробуйте это:

CREATE FUNCTION [dbo].[fnMakbuzIslem] 
( 
      @refNo     as int      
) 

RETURNS @tablename TABLE (kontrol1 INT,key0 INT ,tarih INT ,hizkod INT,hizad INT,ytlhizfiyat INT,hizmiktar INT,ytlhiztutar INT)
AS 
BEGIN

DECLARE @durum     AS VARCHAR = (SELECT durum FROM TH_RefKart WHERE RefNo = @refNo) 
DECLARE @hastaTuru AS VARCHAR = (SELECT HastaTuru FROM TH_Dosya WHERE DosyaNo in (SELECT DosyaNo FROM TH_RefKart WHERE RefNo = @refNo)) 
DECLARE @makTipi   AS VARCHAR = (SELECT maktipi FROM TH_Islem WHERE refNo = @refNo) 

 IF ((@hastaTuru = 'Ücretli') AND (@durum <> 'AYAKTA')) OR @makTipi = '0' 
 BEGIN 
       INSERT @tablename SELECT kontrol1,key0,tarih,hizkod,hizad,ytlhizfiyat,hizmiktar,ytlhiztutar 
       FROM TH_Islem 
       WHERE refno= @refNo and DekontNo = '0' and anahtar<> -1 
 END 

RETURN

END
GO

ГДЕ все столбцы предполагаются как INT, измените их в соответствии с вашими потребностями.

1 голос
/ 22 июля 2009

Хорошо, поэтому (ВЫБЕРИТЕ maktipi ОТ TH_Islem WHERE refNo = @refNo) возвращает несколько значений, что делать сейчас, зависит от того, что вы хотите сделать. Поэтому, если вы хотите получить максимальное значение из этих результатов, используйте:

(SELECT MAX(maktipi) FROM TH_Islem WHERE refNo = @refNo )

или MIN:

(SELECT MIN(maktipi) FROM TH_Islem WHERE refNo = @refNo )

Или, поскольку @makTipi будет использоваться позже для проверки чего-либо, возможно, вы захотите сохранить все возвращенные значения. В этом случае вам нужно изменить @makTipi на таблицу и вставить в нее все значения, возвращаемые (SELECT maktipi FROM TH_Islem WHERE refNo = @refNo). Такие как:

DECLARE @makTipi TABLE(columName AS VARCHAR)
INSERT @makTipi SELECT maktipi FROM TH_Islem WHERE refNo = @refNo

Затем, где у вас есть:

IF ((@hastaTuru = 'Ücretli') AND (@durum = 'AYAKTA')) OR @makTipi = '0'

Измените это на:

IF ((@hastaTuru = 'Ücretli') AND (@durum = 'AYAKTA')) OR EXISTS (SELECT * FROM @makTipi WHERE columnName = '0' )

Надеюсь, это поможет!

...