سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حال همگی خوب باشه
یکی از مسائلی که اکثرا باهاش در کدنویسی ها درگیر هستیم بحث کنارهم قراردادن رشته هاست.
مثلا فرض کنید میخواهیم ستون نام یک جدول رو کنار هم قرارداده و با , اینهارو از هم جدا کنیم ورشته ای مثل رشته زیر رو تولید کنیم.
علی,حمید,محمد,داریوش,....
یکی از روشهای اینکار استفاده از For Xml path بود که باید رشته رو تولید کرده و توسط دستورات stuff رشته درست بشه و اضافاتش حذف بشه.
در نسخه 2017 تابعی به نام String_Agg() اضافه شده که همین کار رو برای شما انجام میده.
این تابع دوتا ورودی میگیره که رشته و نوع جداکننده هست
و همچنین میتونید تعیین کنید رشته مورد نظر براساس چه فیلدی مرتب بشه.
به این مثال توجه کنید.:
SELECT town,
STRING_AGG (email, ';') WITHIN GROUP (ORDER BY email ASC) AS emails
FROM dbo.Employee
GROUP BY town;
نتیجه کوئری :
town emails
Seattle catherine0@adw.com;kim2@adw.com;syed0@adw.com
LA hazem0@adw.com;sam1@adw.com
در این مثال لیست ایمیلها به واسطه ; از هم جداشدند و براساس Town نیز دسته بندی شدند و خود ایمیلها نیز به صورت الفبا مرتب شدند.
امیدوارم این نکته براتون مفید واقع شده باشه.
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#TSQL #For_XML_PAth #String_agg #Concatenates_String
امیدوارم حال همگی خوب باشه
یکی از مسائلی که اکثرا باهاش در کدنویسی ها درگیر هستیم بحث کنارهم قراردادن رشته هاست.
مثلا فرض کنید میخواهیم ستون نام یک جدول رو کنار هم قرارداده و با , اینهارو از هم جدا کنیم ورشته ای مثل رشته زیر رو تولید کنیم.
علی,حمید,محمد,داریوش,....
یکی از روشهای اینکار استفاده از For Xml path بود که باید رشته رو تولید کرده و توسط دستورات stuff رشته درست بشه و اضافاتش حذف بشه.
در نسخه 2017 تابعی به نام String_Agg() اضافه شده که همین کار رو برای شما انجام میده.
این تابع دوتا ورودی میگیره که رشته و نوع جداکننده هست
و همچنین میتونید تعیین کنید رشته مورد نظر براساس چه فیلدی مرتب بشه.
به این مثال توجه کنید.:
SELECT town,
STRING_AGG (email, ';') WITHIN GROUP (ORDER BY email ASC) AS emails
FROM dbo.Employee
GROUP BY town;
نتیجه کوئری :
town emails
Seattle catherine0@adw.com;kim2@adw.com;syed0@adw.com
LA hazem0@adw.com;sam1@adw.com
در این مثال لیست ایمیلها به واسطه ; از هم جداشدند و براساس Town نیز دسته بندی شدند و خود ایمیلها نیز به صورت الفبا مرتب شدند.
امیدوارم این نکته براتون مفید واقع شده باشه.
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#TSQL #For_XML_PAth #String_agg #Concatenates_String
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
یکی از مواردی که در بررسی کدهای سازمانها و شرکتهای مختلف دیدم وجود داره استفاده از Scalar function ها هست. امروز میخوام نکته ای رو بگم که بهتون کمک میکنه پرفورمنس این نوع توابع نیز افزایش پیدا کنه.
اگر در تعریف این تابع دقت کرده باشین این کلید ها وجود داره
<function_option>::=
{
[ ENCRYPTION ]
| [ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
| [ EXECUTE_AS_Clause ]
}
یکی از این گزینه ها Returns null on null input هست . اگر د راستفاده از این تابع در جدول مورد نظر مقادیر Null وجود داره که میتونه Null برگردونه ، با اضافه کردن این گزینه به هدر تابع ، اسکیوال سرور مقادیر Null رو صرفنظر کرده و فقط مقادیر اصلی رو به این تابع ارسال ، و خروجی واحد دریافت خواهد کرد.
مثلا فرض کنید در یک جدولی تابعی نوشتید که میدونید اگر مقدار Null به پارامتر تابع ارسال بشه حتما خروجی Null خواهد بود و این جدول فرضا 40000 ردیف دارد. که 20000 ردیف آن Null و مابقی مقدار دارد.
اگر از این دستور استفاده نکنید و از تابعی که نوشتید در بدنه Select استفاده کنید ، این تابع به ازای هر 40000 ردیف موجود در جدول اجرا خواهد شد. ولی اگر از این دستور استفاده کنید تابع شما فقط 20000 مرتبه اجرا خواهد شد و برای مقادیر Null اجرا نمی شود.
این سبب خواهد شد سرعت پردازش و اجرای کدهای Scalar شما در صورتی که دارای شرط فوق باشه ، افزایش پیدا کنه.
در ضمن اینکه این گزینه از نسخه 2008 به بعد وجود داره.
برای تست این موضوع ، بر روی دیتابیس Adventureworks 2017 نیز میتونید با توابع زیر این رو تست کنید.
USE [AdventureWorks2017];
GO
CREATE FUNCTION [dbo].[ufnLeadingZeros_new](
@Value int
)
RETURNS varchar(8)
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS
BEGIN
DECLARE @ReturnValue varchar(8);
SET @ReturnValue = CONVERT(varchar(8), @Value);
SET @ReturnValue = REPLICATE('0', 8 - DATALENGTH(@ReturnValue)) + @ReturnValue;
RETURN (@ReturnValue);
END;
GO
و سپس این کدهارو اجرا کنید.
SELECT SalesOrderID, dbo.ufnLeadingZeros(CurrencyRateID)
FROM Sales.SalesOrderHeader;
GO
SELECT SalesOrderID, dbo.ufnLeadingZeros_new(CurrencyRateID)
FROM Sales.SalesOrderHeader;
GO
برای مانیتور کردنش هم Event های زیر رو تعریف کنید.
CREATE EVENT SESSION [Session72] ON SERVER
ADD EVENT sqlserver.module_end(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125)))),
ADD EVENT sqlserver.sql_batch_completed(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125)))),
ADD EVENT sqlserver.sql_batch_starting(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125)))),
ADD EVENT sqlserver.sql_statement_completed(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125)))),
ADD EVENT sqlserver.sql_statement_starting(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125))))
WITH (TRACK_CAUSALITY=ON)
GO
فقط نکته اینکه مقدار 125 برای Session تستی من هست که فیلتر کنم که دقیقا همین کدهارو نمایش بده. شما اینرو براساس Session خودتون فیلتر کنید.
امیدوارم این نکته در افزایش سرعت کدهاتون کمکی بهتون بکنه.
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#TSQL #Scalar_Funcion #UDF #Performance
امیدوارم حالتون خوب باشه
یکی از مواردی که در بررسی کدهای سازمانها و شرکتهای مختلف دیدم وجود داره استفاده از Scalar function ها هست. امروز میخوام نکته ای رو بگم که بهتون کمک میکنه پرفورمنس این نوع توابع نیز افزایش پیدا کنه.
اگر در تعریف این تابع دقت کرده باشین این کلید ها وجود داره
<function_option>::=
{
[ ENCRYPTION ]
| [ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
| [ EXECUTE_AS_Clause ]
}
یکی از این گزینه ها Returns null on null input هست . اگر د راستفاده از این تابع در جدول مورد نظر مقادیر Null وجود داره که میتونه Null برگردونه ، با اضافه کردن این گزینه به هدر تابع ، اسکیوال سرور مقادیر Null رو صرفنظر کرده و فقط مقادیر اصلی رو به این تابع ارسال ، و خروجی واحد دریافت خواهد کرد.
مثلا فرض کنید در یک جدولی تابعی نوشتید که میدونید اگر مقدار Null به پارامتر تابع ارسال بشه حتما خروجی Null خواهد بود و این جدول فرضا 40000 ردیف دارد. که 20000 ردیف آن Null و مابقی مقدار دارد.
اگر از این دستور استفاده نکنید و از تابعی که نوشتید در بدنه Select استفاده کنید ، این تابع به ازای هر 40000 ردیف موجود در جدول اجرا خواهد شد. ولی اگر از این دستور استفاده کنید تابع شما فقط 20000 مرتبه اجرا خواهد شد و برای مقادیر Null اجرا نمی شود.
این سبب خواهد شد سرعت پردازش و اجرای کدهای Scalar شما در صورتی که دارای شرط فوق باشه ، افزایش پیدا کنه.
در ضمن اینکه این گزینه از نسخه 2008 به بعد وجود داره.
برای تست این موضوع ، بر روی دیتابیس Adventureworks 2017 نیز میتونید با توابع زیر این رو تست کنید.
USE [AdventureWorks2017];
GO
CREATE FUNCTION [dbo].[ufnLeadingZeros_new](
@Value int
)
RETURNS varchar(8)
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS
BEGIN
DECLARE @ReturnValue varchar(8);
SET @ReturnValue = CONVERT(varchar(8), @Value);
SET @ReturnValue = REPLICATE('0', 8 - DATALENGTH(@ReturnValue)) + @ReturnValue;
RETURN (@ReturnValue);
END;
GO
و سپس این کدهارو اجرا کنید.
SELECT SalesOrderID, dbo.ufnLeadingZeros(CurrencyRateID)
FROM Sales.SalesOrderHeader;
GO
SELECT SalesOrderID, dbo.ufnLeadingZeros_new(CurrencyRateID)
FROM Sales.SalesOrderHeader;
GO
برای مانیتور کردنش هم Event های زیر رو تعریف کنید.
CREATE EVENT SESSION [Session72] ON SERVER
ADD EVENT sqlserver.module_end(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125)))),
ADD EVENT sqlserver.sql_batch_completed(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125)))),
ADD EVENT sqlserver.sql_batch_starting(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125)))),
ADD EVENT sqlserver.sql_statement_completed(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125)))),
ADD EVENT sqlserver.sql_statement_starting(
WHERE ([package0].[equal_uint64]([sqlserver].[session_id],(125))))
WITH (TRACK_CAUSALITY=ON)
GO
فقط نکته اینکه مقدار 125 برای Session تستی من هست که فیلتر کنم که دقیقا همین کدهارو نمایش بده. شما اینرو براساس Session خودتون فیلتر کنید.
امیدوارم این نکته در افزایش سرعت کدهاتون کمکی بهتون بکنه.
ارادتمند شما
حمیدرضا صادقیان
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
#TSQL #Scalar_Funcion #UDF #Performance
سلام وعرض ادب خدمت دوستان عزیز
امیدوارم حالتون خوب باشه
شاید بارها پیش اومده باشه براتون که نیاز داشته باشین روی نتیجه SP ها سلکت بزنین و شرط بذارین یا از نتیجه اون در Join ها استفاده کنید.
خوب راه معمولش این هست که نتیجه SP رو داخل یک جدول موقت بریزین و بعد از اون جدول استفاده کنید.
یک راه ساده تر این هست که از Openrowset استفاده کنید.
برای استفاده از OpenrowSet ابتدا باید دستور زیر رو اجرا کنید.
sp_configure 'Ad Hoc Distributed Queries',1
Go
Reconfigure
go
سپس میتونید از این قالب استفاده کنید.
select a.* from openrowset('sqlncli','server=.;trusted_connection=yes;','
exec DbName.dbo.UspReturnPersonelList
''01-11-2018'',''29-12-2018''') as a
where a.[name] =N'Hamidreza'
در این کد در قسمت Trusted_Connection من از Windows_Authentication استفاده کردم و در قسمت Server هم نام سرور لوکال خودم رو قرار دادم. که میتونه نام هر سروری و باهر دسترسی باشه.
و درنهایت نام دیتابیس به همراه Schema رو با نام SP صدا زدم و بهش دوتا پارامتر تاریخ پاس دادم.
نکته : اگر حجم داده ها زیاد هست و نیاز دارید خیلی از این داده ها استفاده کنید پیشنهاد میکنم از جدول استفاده کنید. چون روی جدول شما قابلیت ایندکس گذاری نیز دارید . این مورد برای زمانهایی هست که یا حجم داده ها کمتر هستن یا تعداد استفاده آنها خیلی کم هست.
امیدوارم از این نکته لذت ببرید ☺️☺️
ارادتمند شما
حمیدرضا صادقیان
#openRowset #SQL_Server #TSQL #SP #Stored_Procedure
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
SQL Server Group :https://t.me/joinchat/BTQQtzy50j_MVbMcUf6PtA
امیدوارم حالتون خوب باشه
شاید بارها پیش اومده باشه براتون که نیاز داشته باشین روی نتیجه SP ها سلکت بزنین و شرط بذارین یا از نتیجه اون در Join ها استفاده کنید.
خوب راه معمولش این هست که نتیجه SP رو داخل یک جدول موقت بریزین و بعد از اون جدول استفاده کنید.
یک راه ساده تر این هست که از Openrowset استفاده کنید.
برای استفاده از OpenrowSet ابتدا باید دستور زیر رو اجرا کنید.
sp_configure 'Ad Hoc Distributed Queries',1
Go
Reconfigure
go
سپس میتونید از این قالب استفاده کنید.
select a.* from openrowset('sqlncli','server=.;trusted_connection=yes;','
exec DbName.dbo.UspReturnPersonelList
''01-11-2018'',''29-12-2018''') as a
where a.[name] =N'Hamidreza'
در این کد در قسمت Trusted_Connection من از Windows_Authentication استفاده کردم و در قسمت Server هم نام سرور لوکال خودم رو قرار دادم. که میتونه نام هر سروری و باهر دسترسی باشه.
و درنهایت نام دیتابیس به همراه Schema رو با نام SP صدا زدم و بهش دوتا پارامتر تاریخ پاس دادم.
نکته : اگر حجم داده ها زیاد هست و نیاز دارید خیلی از این داده ها استفاده کنید پیشنهاد میکنم از جدول استفاده کنید. چون روی جدول شما قابلیت ایندکس گذاری نیز دارید . این مورد برای زمانهایی هست که یا حجم داده ها کمتر هستن یا تعداد استفاده آنها خیلی کم هست.
امیدوارم از این نکته لذت ببرید ☺️☺️
ارادتمند شما
حمیدرضا صادقیان
#openRowset #SQL_Server #TSQL #SP #Stored_Procedure
ID:@Hamidreza_Sadeghian
Channel :@SQL_Server
SQL Server Group :https://t.me/joinchat/BTQQtzy50j_MVbMcUf6PtA
سلام دوستان عزیزم
امیدوارم حالتون خوب باشه
شاید براتون پیش اومده باشه که نیاز داشته باشید برای تغییرات جداول ، یا ایجاد جداول جدید کد بنویسید و در سایت مشتری اجرا کنید.
در نسخه های پایین تر از 2016 برای اینکه یک جدول رو حذف کنید بهتر بود تست می کردین که وجود داره که کد شما خطا نده.
If object_id(N'dbo.Products',N'U') is not null Drop Table Dbo.products
از نسخه 2016 به بعد میتونید از ساختار زیباتر و ساده تری استفاده کنید و به این صورت بنویسید.
Drop Table If exists dbo.products
و اگر چند جدول بود کافیه فقط با کاما از هم جدا بشن . مانند
Drop Table If exists dbo.products,dbo.orders
امیدوارم لذت برده باشید.
شاد و پرانرژی باشید.
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#TSQL_Tips
#DDL
امیدوارم حالتون خوب باشه
شاید براتون پیش اومده باشه که نیاز داشته باشید برای تغییرات جداول ، یا ایجاد جداول جدید کد بنویسید و در سایت مشتری اجرا کنید.
در نسخه های پایین تر از 2016 برای اینکه یک جدول رو حذف کنید بهتر بود تست می کردین که وجود داره که کد شما خطا نده.
If object_id(N'dbo.Products',N'U') is not null Drop Table Dbo.products
از نسخه 2016 به بعد میتونید از ساختار زیباتر و ساده تری استفاده کنید و به این صورت بنویسید.
Drop Table If exists dbo.products
و اگر چند جدول بود کافیه فقط با کاما از هم جدا بشن . مانند
Drop Table If exists dbo.products,dbo.orders
امیدوارم لذت برده باشید.
شاد و پرانرژی باشید.
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#TSQL_Tips
#DDL
سلام و عرض ادب خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
در بحث Logical Processing شاید این سوال برای شما پیش اومده باشه که وقتی برای یک فیلدی در Select میایم Alias تعریف می کنیم چرا د رهمون Select نمیتونیم از اون Alias استفاده کنیم.
به این مثال دقت کنید.
Select
Year(OrderDate) as YearORderDate,
YearOrderDate+1 as NewOrderDate
From
Sales.Orders
توی این دستور شما نمیتونید از فیلد yearOrderDate استفاده کنید . درسته که در Logical Processing اینجا Select پردازش شده ولی دلیل اصلی این هست که تمامی عملیاتی که در Select قرار میگیره به جز distinct و top در یک دسته انجام میشه و در عمل همه اونها باهم پردازش و ایجاد میشن به همین خاطر دسترسی به اون آلیاس هنوز وجود نداره و شما حتما باید از year(OrderDate) در خط دوم استفاده کنید.
امیدوارم لذت برده باشین
شاد و پرانرژی باشید
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#TSQL_Tips
#Logical_Processing
امیدوارم حالتون خوب باشه
در بحث Logical Processing شاید این سوال برای شما پیش اومده باشه که وقتی برای یک فیلدی در Select میایم Alias تعریف می کنیم چرا د رهمون Select نمیتونیم از اون Alias استفاده کنیم.
به این مثال دقت کنید.
Select
Year(OrderDate) as YearORderDate,
YearOrderDate+1 as NewOrderDate
From
Sales.Orders
توی این دستور شما نمیتونید از فیلد yearOrderDate استفاده کنید . درسته که در Logical Processing اینجا Select پردازش شده ولی دلیل اصلی این هست که تمامی عملیاتی که در Select قرار میگیره به جز distinct و top در یک دسته انجام میشه و در عمل همه اونها باهم پردازش و ایجاد میشن به همین خاطر دسترسی به اون آلیاس هنوز وجود نداره و شما حتما باید از year(OrderDate) در خط دوم استفاده کنید.
امیدوارم لذت برده باشین
شاد و پرانرژی باشید
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#TSQL_Tips
#Logical_Processing
سلام خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه.
یک نکته ای رو جاهای مختلف دیدم خواستم بهتون گوشزد کنم.
شاید شنیده باشین که در view ها یا به طور کل در Table Expression ها از order by نمیتونید استفاده کنید و حتما باید Top باشه تا بتونید از order by استفاده کنید.
و حتما هم یا دیدین یا خودتون انجام دادین که به این صورت مثلا بنویسید
Create view vw1
select top 100 percent ...
from ...
order by id
go
خوب باید خدمتتون عرض کنم که این Order by هیچ تضمینی به مرتب شدن خروجی شما در بیرون نمیکنه.
این order by در واقع برای همون سلکت داخل view هست که مثلا شما میخواهید یک تعداد رکورد خاص رو برگردونید.
برای سلکت های بیرونی مثل این هست که شما دارید از یک جدول مجازی سلکت میکنید پس هیچ گارانتی در خصوص مرتب بودن داده ها نداره. و اگر دارید به این صورت مینویسید ، میتونید به راحتی حذفش کنید و در سلکت اصلیتون از Order by استفاده کنید.
امیدوارم لذت برده باشین
شاد و پرانرژی باشید
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#TSQL_Tips
#Logical_Processing
امیدوارم حالتون خوب باشه.
یک نکته ای رو جاهای مختلف دیدم خواستم بهتون گوشزد کنم.
شاید شنیده باشین که در view ها یا به طور کل در Table Expression ها از order by نمیتونید استفاده کنید و حتما باید Top باشه تا بتونید از order by استفاده کنید.
و حتما هم یا دیدین یا خودتون انجام دادین که به این صورت مثلا بنویسید
Create view vw1
select top 100 percent ...
from ...
order by id
go
خوب باید خدمتتون عرض کنم که این Order by هیچ تضمینی به مرتب شدن خروجی شما در بیرون نمیکنه.
این order by در واقع برای همون سلکت داخل view هست که مثلا شما میخواهید یک تعداد رکورد خاص رو برگردونید.
برای سلکت های بیرونی مثل این هست که شما دارید از یک جدول مجازی سلکت میکنید پس هیچ گارانتی در خصوص مرتب بودن داده ها نداره. و اگر دارید به این صورت مینویسید ، میتونید به راحتی حذفش کنید و در سلکت اصلیتون از Order by استفاده کنید.
امیدوارم لذت برده باشین
شاد و پرانرژی باشید
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#TSQL_Tips
#Logical_Processing
سلام خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
زمانی که دارید یک Script مینویسید و قراره یک سری آبجکتها تغییر کنن. شما میاین چک می کنید که ایا وجود داره یاخیر. و اگر داشت حذفش میکنیدو مجدد اونو میسازید. منظورم از این آبجکتها View,sp,function هست.
حالا میتونید از این نوع کد استفاده کنید که دیگه نیازی به اون کنترل نداشته باشید.
CREATE or alter procedure xxx
as
go
امیدوارم لذت برده باشین
شاد و پرانرژی باشید
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#TSQL_Tips
امیدوارم حالتون خوب باشه
زمانی که دارید یک Script مینویسید و قراره یک سری آبجکتها تغییر کنن. شما میاین چک می کنید که ایا وجود داره یاخیر. و اگر داشت حذفش میکنیدو مجدد اونو میسازید. منظورم از این آبجکتها View,sp,function هست.
حالا میتونید از این نوع کد استفاده کنید که دیگه نیازی به اون کنترل نداشته باشید.
CREATE or alter procedure xxx
as
go
امیدوارم لذت برده باشین
شاد و پرانرژی باشید
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#TSQL_Tips
سلام خدمت دوستان عزیزم
امیدوارم حالتون خوب باشه
یکی از چالش هایی که ممکنه وجود داشته باشه بدست آوردن دیتاتایپ و مابقی مشخصات یک فیلد هست که نیاز هست یا از sysobjects بیاید Select کنید یا اینکه از information_schema.Columns استفاده کنید.
ولی یک راه حل ساده تر استفاده از تابع SQL_Variant_Property هست . درواقع این تابع مشخصات مقادیر از نوع SQL_Variant رو بهتون میده . با این تابع ، نوع فیلد ، طول فیلد ، Collation ، Total Byte, Maxlength رو میتوونید مشخص کنید.
به این مثال توجه کنید.
Use AdventureWorks2019
go
select SQL_VARIANT_PROPERTY(Name,'BaseType'),
SQL_VARIANT_PROPERTY(Name,'TotalBytes'),
SQL_VARIANT_PROPERTY(Name,'MaxLength')
from Production.Product
Go
با این کد هم نوع فیلد Name مشخص میشه هم تعداد بایتی که در هر رکورد ذخیره شده برای اون فیلد و هم ماکزیمم اون فیلدرو نشون میده.
امیدوارم لذت برده باشین.
شاد و پرانرژی باشید☺️☺️
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#SQL_Variant_Property
#TSQL_Tips
امیدوارم حالتون خوب باشه
یکی از چالش هایی که ممکنه وجود داشته باشه بدست آوردن دیتاتایپ و مابقی مشخصات یک فیلد هست که نیاز هست یا از sysobjects بیاید Select کنید یا اینکه از information_schema.Columns استفاده کنید.
ولی یک راه حل ساده تر استفاده از تابع SQL_Variant_Property هست . درواقع این تابع مشخصات مقادیر از نوع SQL_Variant رو بهتون میده . با این تابع ، نوع فیلد ، طول فیلد ، Collation ، Total Byte, Maxlength رو میتوونید مشخص کنید.
به این مثال توجه کنید.
Use AdventureWorks2019
go
select SQL_VARIANT_PROPERTY(Name,'BaseType'),
SQL_VARIANT_PROPERTY(Name,'TotalBytes'),
SQL_VARIANT_PROPERTY(Name,'MaxLength')
from Production.Product
Go
با این کد هم نوع فیلد Name مشخص میشه هم تعداد بایتی که در هر رکورد ذخیره شده برای اون فیلد و هم ماکزیمم اون فیلدرو نشون میده.
امیدوارم لذت برده باشین.
شاد و پرانرژی باشید☺️☺️
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#SQL_Variant_Property
#TSQL_Tips
سلام به دوستان عزیزم
داشتم به ساختار LINQ در سی شارپ دقت می کردم ، خیلی جالبه که نحوه نوشتارش براساس Logical Processing خود زبان T-SQL هست. ترتیب نوشتار در زبان T-SQL به شکل زیر هست
1- Select
2- From
3- Where
4- Group by
5- having
6- order
ولی چیزی که در logical Processing رخ میده به این شکل هست
1- from
2- where
3- group by
4- having
5- select
6- order
خیلی برام جالب بود که دقیقا LINQ هم داره با این مدل نوشته میشه. این نکته از این جهت برام جالب بود که اگه این مدلی بهش نگاه بشه یادگیریش خیلی راحت خواهد بود و شاید این سوال رفع شده باشه که چرا در LINQ مثل زبان T-SQL دستور رو نمی نویسیم.
شاد باشین وشکرگزار
حمیدرضا صادقیان
#LINQ #TSQL #LogicalProcessing
داشتم به ساختار LINQ در سی شارپ دقت می کردم ، خیلی جالبه که نحوه نوشتارش براساس Logical Processing خود زبان T-SQL هست. ترتیب نوشتار در زبان T-SQL به شکل زیر هست
1- Select
2- From
3- Where
4- Group by
5- having
6- order
ولی چیزی که در logical Processing رخ میده به این شکل هست
1- from
2- where
3- group by
4- having
5- select
6- order
خیلی برام جالب بود که دقیقا LINQ هم داره با این مدل نوشته میشه. این نکته از این جهت برام جالب بود که اگه این مدلی بهش نگاه بشه یادگیریش خیلی راحت خواهد بود و شاید این سوال رفع شده باشه که چرا در LINQ مثل زبان T-SQL دستور رو نمی نویسیم.
شاد باشین وشکرگزار
حمیدرضا صادقیان
#LINQ #TSQL #LogicalProcessing
👍51👌7❤6👎1
سلام خدمت دوستان عزیزم
امیدوارم عالی عالی باشین
دیروز یکی از دوستانم یک سوالی ازم پرسید در خصوص استفاده از تابع Round.
چالشش این بود که دوتا مقدار داره که اعشاری هستند . میخواد اگه حاصلضرب این دوتا اعشاری شد بدون اینکه رندی اتفاق بیافته قسمت حقیقی اونو نشون بده.
مثلا فرض کنید
1.5*1.8 = 2.7 . اگه رند بشه خوب میشه ۳ یا اگه کمتر از ۲.۵ باشه میشه ۲ . ولی این میخواد در هر حالتی عدد ۲ برگرده.
خوب میتونه از تابع Round استفاده کنه.
Round(1.5*1.8,0,1)
که اون پارامتر اخر دقیقا همین کارو میکنه و قسمت اعشاری رو Truncate میکنه.
چالش اینجا بود سر این دو عدد با این که ضربش یک عدد حقیقی میشد ولی یک ریال کسر میکرد ازش.
۱۳۵.۷ * ۳۵۹۴۰۰ = ۴۸۷۷۰۵۸۰ باید بشه ولی عدد ۴۸۷۷۰۵۷۹ رو این تابع برمیگردوند.
برام خیلی جالب بود . رفتم دیتا تایپهای دیتابیسش رو بررسی کردم دیدم جفت فیلدهارو از نوع Float گرفته. اونارو به Decimal تبدیل کردیم درست شد.
احتمالا شاید اگه شما هم چنین خطاهای محاسباتی دارید بیاید از دیتاتایپ های دقیقتر استفاده کنید که چنین مشکلاتی نداشته باشین.
شاد باشین و شکرگزار
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#TSQL
#SQL
امیدوارم عالی عالی باشین
دیروز یکی از دوستانم یک سوالی ازم پرسید در خصوص استفاده از تابع Round.
چالشش این بود که دوتا مقدار داره که اعشاری هستند . میخواد اگه حاصلضرب این دوتا اعشاری شد بدون اینکه رندی اتفاق بیافته قسمت حقیقی اونو نشون بده.
مثلا فرض کنید
1.5*1.8 = 2.7 . اگه رند بشه خوب میشه ۳ یا اگه کمتر از ۲.۵ باشه میشه ۲ . ولی این میخواد در هر حالتی عدد ۲ برگرده.
خوب میتونه از تابع Round استفاده کنه.
Round(1.5*1.8,0,1)
که اون پارامتر اخر دقیقا همین کارو میکنه و قسمت اعشاری رو Truncate میکنه.
چالش اینجا بود سر این دو عدد با این که ضربش یک عدد حقیقی میشد ولی یک ریال کسر میکرد ازش.
۱۳۵.۷ * ۳۵۹۴۰۰ = ۴۸۷۷۰۵۸۰ باید بشه ولی عدد ۴۸۷۷۰۵۷۹ رو این تابع برمیگردوند.
برام خیلی جالب بود . رفتم دیتا تایپهای دیتابیسش رو بررسی کردم دیدم جفت فیلدهارو از نوع Float گرفته. اونارو به Decimal تبدیل کردیم درست شد.
احتمالا شاید اگه شما هم چنین خطاهای محاسباتی دارید بیاید از دیتاتایپ های دقیقتر استفاده کنید که چنین مشکلاتی نداشته باشین.
شاد باشین و شکرگزار
حمیدرضا صادقیان
@Hamidreza_Sadeghian
#TSQL
#SQL
👍29❤14👌7👏1
Media is too big
VIEW IN TELEGRAM
سلام خدمت دوستان عزیزم.
امیدوارم که عالی عالی باشین
در این فیلم ، من در خصوص استفاده از دستور Output در Update صحبت می کنم.
امیدوارم مفید واقع بشه
شاد باشین و شکرگزار
حمیدرضا صادقیان
#Tsql
#Update
#output
امیدوارم که عالی عالی باشین
در این فیلم ، من در خصوص استفاده از دستور Output در Update صحبت می کنم.
امیدوارم مفید واقع بشه
شاد باشین و شکرگزار
حمیدرضا صادقیان
#Tsql
#Update
#output
👍14❤6👏1🤝1
خوب بریم برای یک چالش ذهنی جذاب دیگه.
در روایات آمده :
(( ای کسانی که ایمان آورده اید( منظور کسانی هست که به SQL Server ایمان آوردند) مبادا در نوع کدنویسی به صورت Row Based فکر کنید ، که همانا شما از کافران هستید)) 😉
حالا بریم برای روایت فوق .
بذارید با یک داستان جذاب شروع کنم. در یکی از پروژه هایی که کند بودیم و داشتیم در خصوص سناریوها صحبت می کردیم ، اینجوری پروژه شرح داده شد که ما یک سری محتویات XML در یک جدول داریم و باید اونها رو ردیف به ردیف خونده و یکسری عملیات روش انجام بدیم و درج کنیم. خوب به این عبارت ردیف به ردیف 🤬 🤬
دقت کنید.
بهش گفتم گل من ،چرا ردیف به ردیف اخه؟ تو که برای هر ردیف داری یک کاری انجام میدی گفت بله.
گفتم بعد در یک سری جدول هم درج می کنی گفت بله.
گفتم خوب مبارکه. همون اول بسم الله به جای اینکه یک ردیف رو سلکت کنی و بریزی داخل یک Temp ، بیا مثلا ۱۰۰۰ رکورد رو انتخاب کن بریز داخل Temp.
به جای اینکه اون عملیات رو برای یک ردیف انجام بدی بیا مثلا برای ۱۰۰۰ تا انجام بده چی میشه؟ گفت اخه من میخوام این عملیات روی تک تک رکوردها انجام بشه.
گفتم ببین دیگه اومدی و نسازیا. آقا به توچه SQL Server چطوری میاد اون کارو برای ۱۰۰۰ تا انجام میده.
تو بهش بگو برادر من عزیز من ، من ۱۰۰۰ تا ردیف XML دارم و قراره این اتفاقات روش بیافته. حالا دیگه این عزیزدل چطوری میره و برای تک تک اون ردیفها اینکارو انجام میده به من و توچه ربطی داره؟ برو به زندگیت برس اینقدر دخالت نکن. ول کن اخه. 😁
و همین امر سبب میشه یک فرآیندی که ساعتها زمان میبره به کمتر از چند دقیقه کاهش پیدا کنه. مورد داشتیم چنین عملیاتی ۷۲ ساعت برای پردازش ۳۰۰ هزار رکورد زمان میگرفت و با چنین تغییر تفکری زمانش به ۲ دقیقه کاهش پیدا کرد.
حالا بازم برید تفکر Set Based رو از داخل کدهاتون حذف کنید. بازهم هی بیاید بگید باید ردیف به ردیف 🤬 🤬 اینکارو انجام بدیم. باز هم برید داخل کدهاتون دوجین Cursor , While بذارید.
ایمان بیاورید و دست از اعتقادات خرافه بردارید.
اگر خواستید ما هم میتوانیم در ایمان آوردن شما بهتون کمک کنیم. 😅
اینم راه ارتباطی دعانویسمون :😂
@Hamidreza_Sadeghian
#set_Based
#Row_Based
#TSQL
در روایات آمده :
(( ای کسانی که ایمان آورده اید( منظور کسانی هست که به SQL Server ایمان آوردند) مبادا در نوع کدنویسی به صورت Row Based فکر کنید ، که همانا شما از کافران هستید)) 😉
حالا بریم برای روایت فوق .
بذارید با یک داستان جذاب شروع کنم. در یکی از پروژه هایی که کند بودیم و داشتیم در خصوص سناریوها صحبت می کردیم ، اینجوری پروژه شرح داده شد که ما یک سری محتویات XML در یک جدول داریم و باید اونها رو ردیف به ردیف خونده و یکسری عملیات روش انجام بدیم و درج کنیم. خوب به این عبارت ردیف به ردیف 🤬 🤬
دقت کنید.
بهش گفتم گل من ،چرا ردیف به ردیف اخه؟ تو که برای هر ردیف داری یک کاری انجام میدی گفت بله.
گفتم بعد در یک سری جدول هم درج می کنی گفت بله.
گفتم خوب مبارکه. همون اول بسم الله به جای اینکه یک ردیف رو سلکت کنی و بریزی داخل یک Temp ، بیا مثلا ۱۰۰۰ رکورد رو انتخاب کن بریز داخل Temp.
به جای اینکه اون عملیات رو برای یک ردیف انجام بدی بیا مثلا برای ۱۰۰۰ تا انجام بده چی میشه؟ گفت اخه من میخوام این عملیات روی تک تک رکوردها انجام بشه.
گفتم ببین دیگه اومدی و نسازیا. آقا به توچه SQL Server چطوری میاد اون کارو برای ۱۰۰۰ تا انجام میده.
تو بهش بگو برادر من عزیز من ، من ۱۰۰۰ تا ردیف XML دارم و قراره این اتفاقات روش بیافته. حالا دیگه این عزیزدل چطوری میره و برای تک تک اون ردیفها اینکارو انجام میده به من و توچه ربطی داره؟ برو به زندگیت برس اینقدر دخالت نکن. ول کن اخه. 😁
و همین امر سبب میشه یک فرآیندی که ساعتها زمان میبره به کمتر از چند دقیقه کاهش پیدا کنه. مورد داشتیم چنین عملیاتی ۷۲ ساعت برای پردازش ۳۰۰ هزار رکورد زمان میگرفت و با چنین تغییر تفکری زمانش به ۲ دقیقه کاهش پیدا کرد.
حالا بازم برید تفکر Set Based رو از داخل کدهاتون حذف کنید. بازهم هی بیاید بگید باید ردیف به ردیف 🤬 🤬 اینکارو انجام بدیم. باز هم برید داخل کدهاتون دوجین Cursor , While بذارید.
ایمان بیاورید و دست از اعتقادات خرافه بردارید.
اگر خواستید ما هم میتوانیم در ایمان آوردن شما بهتون کمک کنیم. 😅
اینم راه ارتباطی دعانویسمون :😂
@Hamidreza_Sadeghian
#set_Based
#Row_Based
#TSQL
👌23👍10😍3🔥2👏2