নোট নূলে গণনা করা কলামটি কেন একটি দৃষ্টিতে নলাবদ্ধ বলে বিবেচিত হয়?


15

আমার একটি টেবিল রয়েছে:

CREATE TABLE [dbo].[Realty](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [RankingBonus] [int] NOT NULL,
    [Ranking]  AS ([Id]+[RankingBonus]) PERSISTED NOT NULL
    ....
)

এবং একটি দৃশ্য:

CREATE View  [dbo].[FilteredRealty] AS
 SELECT 
realty.Id as realtyId,
...
COALESCE(realty.Wgs84X, ruian_cobce.Wgs84X, ruian_obec.Wgs84X) as Wgs84X,
COALESCE(realty.Wgs84Y, ruian_cobce.Wgs84Y, ruian_obec.Wgs84Y) as Wgs84Y,
realty.Ranking,
...
FROM realty
JOIN Category ON realty.CategoryId = Category.Id
LEFT JOIN ruian_cobce ON realty.cobceId = ruian_cobce.cobce_kod
LEFT JOIN ruian_obec ON realty.obecId = ruian_obec.obec_kod
LEFT JOIN okres ON realty.okresId = okres.okres_kod
LEFT JOIN ExternFile ON realty.Id = ExternFile.ForeignId AND ExternFile.IsMain = 1
                     AND ExternFile.ForeignTable = 5
INNER JOIN Person ON realty.OwnerId = Person.Id
WHERE Person.ConfirmStatus = 1

আমি সি # (LinqToSQL) একটি dbml মডেল আছে FilteredRealty এতে দৃশ্য। [রাঙ্কিং] ক্ষেত্রটিতে কোনও nullable int হিসাবে তাই আমি যখন আমি ডাটাবেসের মধ্যে কিছু পরিবর্তন প্রত্যেক সময় কোডটি টাইপ ঠিক করতে স্বীকৃত। এটি আমার জন্য অনেক হতাশার কাজ এবং অনেকগুলি ম্যানুয়াল কাজ।

ফিল্টারআলটিটিতে ( এই সম্পর্কিত প্রশ্ন সম্পর্কিত ) কোনও সমষ্টি ব্যবহার করা হয়নি ।

রিয়েলটি.র্যাঙ্কিং অ- শর্তযুক্ত হলে কেন ভিউ র‌্যাঙ্কিং কলামটি বাতিল হিসাবে বিবেচিত হবে ?

উত্তর:


19

[Ranking]ক্ষেত্রটিতে কোনও কম্পিউটেড কলাম হচ্ছে কারণে হিসাবে "Nullable" দেখানো হয়। হ্যাঁ, এটি হিসাবে ঘোষিত হয়েছে NOT NULL, তবে গণিত কলামগুলির জন্য এমএসডিএন পৃষ্ঠা হিসাবে বলা হয়েছে, ডাটাবেস ইঞ্জিন ক্যোয়ারী-সময়ে সেই সংকল্পটি পরিবর্তন করতে পারে:

ডেটাবেস ইঞ্জিন স্বয়ংক্রিয়ভাবে ব্যবহৃত অভিব্যক্তিগুলির উপর ভিত্তি করে গণিত কলামগুলির nullability নির্ধারণ করে। কেবলমাত্র অচ্ছুক কলামগুলি উপস্থিত থাকলেও বেশিরভাগ এক্সপ্রেশনগুলির ফলাফলকে অযোগ্য বলে বিবেচনা করা হয়, কারণ সম্ভাব্য আন্ডারফ্লোস বা ওভারফ্লোগুলি নাল ফলাফলও অর্জন করবে। সঙ্গে COLUMNPROPERTY ফাংশন ব্যবহার করুন AllowsNull একটি টেবিল যে কোন কম্পিউটেড কলামের nullability তদন্ত করতে সম্পত্তি। অবিচ্ছিন্ন একটি অভিব্যক্তি আইএসএনএলএল ( চেক_প্রকাশ , ধ্রুবক ) নির্দিষ্ট করে একটি অননুমোদিত রূপে রূপান্তরিত করা যেতে পারে , যেখানে ধ্রুবকটি কোনও নাল ফলাফলের জন্য প্রতিস্থাপিত একটি ননাল মান।

সুতরাং, আসুন দেখুন এটি সত্য কিনা:

CREATE TABLE [dbo].[Realty](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [RankingBonus] [int] NOT NULL,
    [Ranking]  AS ([Id]+[RankingBonus]) PERSISTED NOT NULL
);
GO

EXEC sp_help 'dbo.Realty';
-- Ranking: Nullable = "no"

SELECT COLUMNPROPERTY(OBJECT_ID(N'dbo.Realty'), N'Ranking', 'AllowsNull') AS [AllowsNull?];
-- 0

SELECT * FROM sys.dm_exec_describe_first_result_set(N'SELECT * FROM dbo.Realty', '', NULL);
-- Ranking: is_nullable = 1  ==  :-(

এখন দেখা যাক তাদের ISNULLকাজের বিষয়ে তাদের পরামর্শটি কিনা :

SELECT * FROM sys.dm_exec_describe_first_result_set(
   N'SELECT Id, RankingBonus, ISNULL(Ranking, -99) AS [RealRanking] FROM dbo.Realty;',
   '',
   NULL);
-- RealRanking: is_nullable = 0

তাদের পরামর্শটি যথাযথ বলে মনে হচ্ছে, সুতরাং আসুন গণিত কলামের সংজ্ঞায় এটি প্রয়োগ করার চেষ্টা করুন:

ALTER TABLE dbo.Realty
  ADD [RankingFixed] AS (ISNULL(([Id]+[RankingBonus]), -99))
  PERSISTED NOT NULL;
GO

এবং এখন আমরা আবার বৈশিষ্ট্যগুলি পরীক্ষা করে দেখি, তবে নতুন ক্ষেত্রের জন্য:

EXEC sp_help 'dbo.Realty';
-- RankingFixed: Nullable = "no"

SELECT COLUMNPROPERTY(OBJECT_ID(N'dbo.Realty'),
                      N'RankingFixed',
                      'AllowsNull') AS [AllowsNullsNow?];
-- 0

এটি এখন পর্যন্ত ইতিবাচক দেখাচ্ছে, কিন্তু মূল সংজ্ঞাটি এই দুটি চেক থেকে "নট নল" প্রতিবেদন করেছে। আসুন আসল পরীক্ষার চেষ্টা করা যাক - ডাটাবেস ইঞ্জিন কীভাবে রান-টাইমে অযোগ্যতা নির্ধারণ করে:

SELECT * FROM sys.dm_exec_describe_first_result_set(N'SELECT * FROM dbo.Realty', '', NULL);
-- RankingFixed: is_nullable = 0  ==  :-) WOO HOO!

13

গ্যারান্টি দিতে যে র‌্যাঙ্কিং গণনা কলাম এক্সপ্রেশন কোনও পরিস্থিতিতে NULL ফেরত না, আপনার অবশ্যই এটি ISNULLএকটি উপযুক্ত ডিফল্ট মান সহ মোড়ানো আবশ্যক । উদাহরণ স্বরূপ:

Ranking AS ISNULL(Id + RankingBonus, 0) PERSISTED NOT NULL

NOT NULLবাধ্যতা নিশ্চিত করে চলতে থাকে মান নয় যখন টেবিল রুপান্তরিত করা হয়েছে নাল, কার্যকরী table- এবং সেশনের লেভেল সেটিংস প্রেক্ষাপটে হয়।

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

কিছু অধিবেশন সেটিংস উদাহরণস্বরূপ, NULL ফেরার জন্য একটি ওভারফ্লো হতে পারে, সুতরাং এসকিউএল সার্ভারকে এই সম্ভাবনার জন্য অ্যাকাউন্ট করতে হবে। যখন ভিউয়ের মাধ্যমে অ্যাক্সেস করা হয়, এসকিউএল সার্ভারটি কলামটি সঠিকভাবে কোনও NULL ফেরত হিসাবে চিহ্নিত করে।

ISNULLআপনি যা চান তা অর্জনের একমাত্র সমর্থিত উপায় হ'ল এক্সপ্রেশনটিতে একটি বহিরাগত ব্যবহার করা । COALESCEউদাহরণস্বরূপ ব্যবহার করা কার্যকর হবে না।

ডেমো:

CREATE TABLE dbo.T1
(
    c1 integer NOT NULL,
    c2 integer NOT NULL,
    c3 AS c1 + c2 PERSISTED NOT NULL
);
GO
CREATE VIEW dbo.V1
AS
SELECT T.c1,
       T.c2,
       T.c3
FROM dbo.T1 AS T;
GO
SELECT AllowsNull = COLUMNPROPERTY(OBJECT_ID(N'dbo.V1', N'V'), N'c3', 'AllowsNull');
GO
ALTER TABLE dbo.T1
DROP COLUMN c3;
GO
ALTER TABLE dbo.T1
ADD c3 AS ISNULL(c1 + c2, 0) PERSISTED NOT NULL;
GO
EXECUTE sys.sp_refreshsqlmodule
    @name = N'dbo.V1';
GO
SELECT AllowsNull = COLUMNPROPERTY(OBJECT_ID(N'dbo.V1', N'V'), N'c3', 'AllowsNull');
GO
DROP VIEW dbo.V1;
DROP TABLE dbo.T1;
GO

sys.sp_refreshsqlmoduleআপনার ভিউ স্কিমাবাউন্ড না হওয়ার কারণে এর ব্যবহারটি নোট করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.