টি-এসকিউএল - ডিফল্ট পরামিতিগুলির সাথে ফাংশন


155

আমার এই স্ক্রিপ্ট আছে:

CREATE FUNCTION dbo.CheckIfSFExists(@param1 INT, @param2 BIT = 1 )
RETURNS BIT
AS
BEGIN
    IF EXISTS ( bla bla bla )
        RETURN 1;
    RETURN 0;
END
GO

আমি এটিকে একটি পদ্ধতিতে এটি ব্যবহার করতে চাই:

IF dbo.CheckIfSFExists( 23 ) = 0
    SET @retValue = 'bla bla bla';

তবে আমি ত্রুটি পেয়েছি:

প্রক্রিয়া বা ফাংশন dbo.CheckIfSFExists এর জন্য অপর্যাপ্ত সংখ্যক যুক্তি সরবরাহ করা হয়েছিল।

কেন এটি কাজ করে না?

উত্তর:


227

আপনাকে এটিকে এভাবে ডাকতে হবে

SELECT dbo.CheckIfSFExists(23, default)

টেকনেট থেকে :

যখন ফাংশনটির কোনও প্যারামিটারের একটি ডিফল্ট মান থাকে, ডিফল্ট মানটি পুনরুদ্ধার করার জন্য ফাংশনটি ডাকা হলে ডিফল্ট কীওয়ার্ড নির্দিষ্ট করা আবশ্যক। এই আচরণটি স্টোরেজ পদ্ধতিতে ডিফল্ট মানগুলির সাথে পরামিতি ব্যবহার করা থেকে পৃথক হয় যেখানে পরামিতি বাদ দেওয়াও ডিফল্ট মান বোঝায়। এই আচরণের একটি ব্যতিক্রম হ'ল এক্সেকিউটি স্টেটমেন্টটি ব্যবহার করে কোনও স্কেলার ফাংশন চাওয়ার সময়। এক্সিকিউটি ব্যবহার করার সময়, ডিফল্ট কীওয়ার্ডের প্রয়োজন হয় না।


80
এই দেখে আমি হতাশ হই। আমি defaultএখানে ধারণার সুবিধা পাচ্ছি না ... আমার এখনই সমস্ত স্থান পরিবর্তন করতে হবে।
এলসিজে

8
@ লিজো, আপনি প্রতিটি কলটিতে আপনার কংক্রিটের ডিফল্ট মানটি নকল না করার সুবিধা পাবেন।
ফ্রেডেরিক

9
যেহেতু আমাদের ওভারলে করার অনুমতি নেই, এবং "ডিফল্ট" এভাবে ব্যবহারযোগ্যতা সীমিত করে তোলে, প্রায়শই সর্বোত্তম পন্থা অতিরিক্ত প্যারামিটার সহ একটি প্রত্যয় (এখানে চেকআইএফএসএফএক্সিস্টেক্সেক্স বলুন) সহ একটি নতুন বর্ধিত সংস্করণ তৈরি করা এবং মূল ফাংশনটিকে কেবলমাত্র পরিবর্তন করতে হবে best "ডিফল্ট" প্যারামিটার সহ বর্ধিত সংস্করণটিকে কল করা। এইভাবে সমস্ত বিদ্যমান কোড কাজ করে এবং আপনার বজায় রাখার জন্য কেবলমাত্র একটি জায়গা রয়েছে।
এস্কে রাহ্ন

39

আপনি এটিকে তিনটি উপায়ে কল করতে পারেন - পরামিতিগুলির সাথে, ডিফল্ট এবং এক্সিকিউটির মাধ্যমে

SET NOCOUNT ON;

DECLARE
@Table  SYSNAME = 'YourTable',
@Schema SYSNAME = 'dbo',
@Rows   INT;

SELECT dbo.TableRowCount( @Table, @Schema )

SELECT dbo.TableRowCount( @Table, DEFAULT )

EXECUTE @Rows = dbo.TableRowCount @Table

SELECT @Rows

11
DEFAULTকীওয়ার্ডটি নির্বাচনের ক্ষেত্রে প্রয়োজনীয়, তবে সম্পাদন করতে গেলে বাদ দেওয়া যেতে পারে? এটি স্তন্যপান: / আশা করি এটি কোনও দিন ঠিক হয়ে যাবে।
মিসিউ

@ মিসিউ, এটি "স্থির" হওয়ার দরকার নেই। এটা নকশা দ্বারা। আমি প্রতিটি আর্গুমেন্ট নির্দিষ্ট না করে কেবল কোনও ফাংশন কল করতে সক্ষম হয়ে একটি "আদর্শ" লক্ষ্য অর্জনের জন্য প্রচুর বিকল্পগুলি পড়েছি, তবে কেন এটি প্রয়োজন তার স্পষ্ট ব্যাখ্যা আমি পাইনি। কোডটি পরিষ্কার হওয়া এবং এটি অর্জনের জন্য একটি কৌশল হওয়া উচিত যা কোডারকে সর্বদা সচেতন হতে হবে "হেই, আপনি একটি ফাংশন বলছেন যা এই এবং এই অন্যান্য যুক্তি রয়েছে যা ডিফল্ট মান রয়েছে বলে ভুলে যাবেন না। ডিফল্ট মান পরিবর্তন হতে পারে "। সুতরাং, আইএমও, এটি থাকা ভাল "খারাপ জিনিস"।
গুস্তাভো পিনসার্ড

16

ব্যবহারকারীর সংজ্ঞায়িত ফাংশনগুলির সাথে, আপনাকে প্রতিটি পরামিতি ঘোষণা করতে হবে, এমনকি যদি তাদের ডিফল্ট মান থাকে।

নিম্নলিখিতটি সফলভাবে সম্পাদন করবে:

IF dbo.CheckIfSFExists( 23, default ) = 0
    SET @retValue = 'bla bla bla;

-1

এই সমস্যার প্রায় এক উপায় হ'ল আউটপুট প্যারামিটার সহ সঞ্চিত পদ্ধতি ব্যবহার করা।

এক্সিকিউট এসপি_মাইসপ্রোকন নাম @ রিটার্নাল্যু আউটপুট, @ ফির্তপ্যারাম = 1, @ সেকেন্ডারাম = 2

সঞ্চিত পদ্ধতিতে ডিফল্ট হিসাবে আপনি মান নির্ধারণ করেন না। এবং আপনি আপনার আউটপুট ভেরিয়েবল থেকে ফলাফল পেতে পারেন।


1
একটি সঞ্চিত পদ্ধতিতে আপনার ফাংশন পরিবর্তন করা ভাল কোনও সমাধান নয়, কারণ কোনও কোয়েরির মধ্যে থেকে সঞ্চিত পদ্ধতিটি কল করা যায় না, তবে একটি ফাংশন পারে can
ব্লেড

সত্য, তবে কোডের সমস্ত ব্লককে কোয়েরির মধ্যে থেকে কল করার প্রয়োজন নেই। এটি দেখানো হয়েছে যে ফাংশনগুলির জন্য ডিফল্ট মানগুলি পরিচালনা করার জন্য স্ক্যুএলটির একটি ভাল পদ্ধতি নেই (ডিফল্ট কীওয়ার্ডটি ব্যবহার করা একটি মান যুক্ত করার মতো প্রায় কাজ করে)। এটি একটি ভাল সাধারণ সমাধান নয়, তবে এটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে দুর্দান্ত কাজ করে।
জেরেম গেন্টার

লোকেরা এটি চিহ্নিত করে রাখে, তবে আমি এটির সাথে আঁকছি। আপনার যদি কোডটির পুনঃব্যবহারযোগ্য অংশ থাকতে হয় তবে এটিকে কোয়েরির ভিতরে ডাকা হবে না এবং আপনি ডিফল্ট মানগুলির সাথে সত্য alচ্ছিক পরামিতিগুলির নমনীয়তা চান তবে একটি সঞ্চিত পদ্ধতিটি একটি ফাংশনের চেয়ে আরও ভাল।
জেরেম গেন্টার

1
সঞ্চিত পদ্ধতি ব্যবহারের অর্থ কোনও ফাংশন ব্যবহারের পরিবর্তে সেগুলি ব্যবহার করার অর্থ নয় - এর অর্থ কোনও কার্যের চারপাশে মোড়ক হিসাবে সঞ্চিত প্রক্রিয়াটি ব্যবহার করা যেতে পারে। আমি প্রায়শই এই কৌশলটি ব্যবহার করি; ডিফল্ট কীওয়ার্ড এখন proc ভিতরে আড়াল করা হয়। আমার ধারণা এই ধারণাটি ঠিক আছে। এটি চাইলে আমাকে আরও জটিল ডিফল্ট তৈরি করতে দেয় - ফাংশন থেকে পৃথক, যা আরও বিশুদ্ধ অবস্থায় থাকতে পারে।
জে ব্রায়ান দাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.