S.A
Bir Scaler function yazman istiyorum ve bu fonksiyon bana kendisine parametre olarak gönderdiğim tablo adına göre o tablonun primary key ini bulup
bu alana göre max numarayı 1 arttırıp geri döndürecek fakat biryerde sorun oluşuyor nerde hata yaptım yardımcı olabilirmisiniz.
Aşağıdaki kodu Check işleminden gecirince sorun göstermiyor fakat excute ta etmiyor
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[FNS_TabloGetMaxID]
(
@pTabloAdi varchar(100)
)
RETURNS int
AS
BEGIN
Declare @TabloIDName varchar(100) = ''
Declare @MaxID int = 0
Declare @xSabit varchar(20) = 'PRIMARY KEY'
Set @TabloIDName = (select c.COLUMN_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk , INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
where pk.TABLE_NAME = @pTabloAdi
and CONSTRAINT_TYPE = @xSabit
and c.TABLE_NAME = pk.TABLE_NAME
and c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME)
Set @MaxID = (SELECT MAX(@TabloIDName) AS SONNO FROM @pTabloAdi)
if (@MaxID is Null) or (@MaxID = 0)
Set @MaxID = 1
else
Set @MaxID = @MaxID + 1
RETURN @MaxID
END
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız. Mevlana
Set @MaxID = (SELECT MAX(@TabloIDName) AS SONNO FROM @pTabloAdi)
Bu satırı Tırnak İçerisinde Execute Block olarak işletmek gerek.
Yani Function veya procedure un içine yadığınız sabit SELECT gibi komutlarda, tablo ismi değişken olamaz (diye biliyorum ama mikropsoft bu yaptım diyor olabilir)
Sorunun ne olduğunu anladınız mı? Anladıysanız zaten ne yapacağınız belli, EXECUTE Statementlar için Table Name mutlak surette Constant olmalıdır. Yani oraya değişken veremezsiniz. Onun yerine oluşturulacak olan cümleden çıkacak değerler için tek tek cümleler oluşturmalısınız.
strBlock = 'Set @MaxID = (SELECT MAX('+@TabloIDName+') AS SONNO FROM '+@pTabloAdi+')'
EXECUTE strBlock
Tam syntaxını hatırlamadığım için yaklaşık birşeyler yazdım. Bu şekilde düşünüp yapmanız lazım. strBlock içine bir tane SQL Statement oluşturup, daha sonra bunu EXECUTE etmelisiniz.
Aşağıda yardımcı olmaya çalışan tüm herkese teşekkürler
Fakat bu kodları hiç çalıştırabileniniz varmıdır
ben veridğiniz örneklerin hepsini denedim fakat bir türlü çalıştıramadım
Acaba bu kodlar böyle çalışması gerekir diye verdiğiniz kodlarmıdır yoksa benim gözden kaçırdığım bir şeylerimi var
Teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız. Mevlana
arkadaşım arkadaşlar sormuş hata mesajı ne alıyorsun diye. birşey yazmamışsın.
çalıştıramadım demişsin sadece.
fonksiyon olarak çalıştırmak istediğin kodları normal olarak çalıştır.
birde yanlış hatırlamıyor isem fonksiyon içerisinde sabit sorgu çalıştırmada sıkıntı oluyordu. fonksiyon yerine procedure olarak bir deneyin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim