فرض کنید حالتی در اسکیوال سرور(sql server) بوجود آمده که نیاز دارید مقدار فیلد های یک آبجکت(object) با ساختار جیسون(json) را بصورت داینامیک با ارسال پارامتر بخونید.
مثل نمونه زیر:

متغیر استرینگ شامل یک آبجکت جیسون و متغییر استرینگ شامل عنوان یکی از فیلد های آبجکت:

declare @jsonData Varchar(100)='{"username":"admin","password":"******"}'
declare @fieldName Varchar(100)='username'

اگه روی سیستمتون اس کیو ال ۲۰۱۷ به بالا دارید که خوشبحالتون! براحتی با دستور پایین میتونید این کار رو انجام بدید.

select JSON_VALUE(@jsonData,'$.'+@fieldName)

خوب الان تکلیف کسی که ورژن پائین تره اس کیو ال رو استفاده میکنه چیه؟
دوتا راه دارید:
۱- اس کیو ال ۲۰۱۷ یا ورژن بالاتر رو نصب کنید 🙂
۲- از روش داینامیک کوئری ها استفاده کنید

خوب اگه امکان نصب نسخه بالاتر رو ندارید یا خدای نکرده مثل من تنبلید و حال نصب یه نسخه جدید رو ندارید از کوئری داینامیک ها به شکل زیر میتونید استفاده کنید:

declare @jsonData Varchar(100)='{"username":"admin","password":"******"}'
declare @fieldName varchar(max)='username'
declare @sql nvarchar(max)
set @sql='select @field=JSON_VALUE('''+@obj+''', ''$.'+@nameField+''')';
exec sp_executesql @sql

در مثال بالا تنها کاری که کردیم این بود که همون دستور رو داخل یک متغیر استرینگ ریختیم و با اجرای اون بصورت sp_executesql خروجی رو مشاهده کردیم
خوشبختانه خیلی هم سخت نبود 🙂

در صورتی که بخواید خروجی این کوئری رو داخل یک متغیر دیگه بریزید ، می تونید از OUTPUT Parameter استفاده کنید:

declare @field Varchar(max)
declare @jsonData Varchar(100)='{"username":"admin","password":"******"}'
declare @fieldName varchar(max)='username'
declare @sql nvarchar(max)
set @sql='select @field=JSON_VALUE('''+@obj+''', ''$.'+@nameField+''')';
exec sp_executesql @sql,N'@field varchar(max) OUTPUT',@field=@field OUTPUT

توی مثال بالا یک متغیر بنام field اضافه شد و خروجی داینامیک کوئری رو داخل اون ریختیم
البته که یکم کار گره خورد!

شمام اگه روش بهتر و یا راحت تری بلدید خوشحال میشم توی کامنت ها معرفی کنید

درباره نویسنده

antievil

بنیانگذار

هیچ فضایی رو توی سطح اینترنت پیدا نکردم که بتونه تمام دسته هایی که قصد انتشارشون رو دارم رو ساپورت کنه ، لذا هم جهت آزاد بودن و هم جهت دیده شدن یک وب سایت شخصی ایجاد کردم ، امیدوارم از مطالب و محتواهایی که براتون قرار میدم نهایت لذت رو ببرید :)

مشاهده تمام مقالات