فرض کنید حالتی در اسکیوال سرور(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 اضافه شد و خروجی داینامیک کوئری رو داخل اون ریختیم
البته که یکم کار گره خورد!
شمام اگه روش بهتر و یا راحت تری بلدید خوشحال میشم توی کامنت ها معرفی کنید