ورود

View Full Version : اجراي sql ديناميك داخل function



esteghamat
چهارشنبه 14 آبان 1393, 13:47 عصر
با سلام
من به دليلي مجبورم كه از sql ديناميك داخل تابع استفاده كنم .
خطا مي دهد و جستجوي اينترنت هم زياد انجام دادم و خلاصه اينكه چنين سرويسي ارائه نمي شود.
آيا هيچ راه حلي داريد كه من بتوانم به نحوي داخل function از دستور exec و sp_execsql استفاده كنم .

create FUNCTION Func2(@Code int)
RETURNS @Ts1var TABLE (
Col1 int NULL,
Col2 nchar(20) NULL)
AS
BEGIN
Declare @StrSql varchar(100)
Set @StrSql = 'INSERT INTO @Ts1var (Col1,Col2) '+
' SELECT C1+10,Rtrim(Ltrim(C2))+ '' New''' +
' FROM Ts1 '
exec sp_executeSql @StrSql
RETURN;
END;

select * from func2(2)

حمیدرضاصادقیان
پنج شنبه 15 آبان 1393, 21:30 عصر
سلام
درون تابع شما نمیتوانید از Dynamic Query استفاده کنید. به خاطر اینکه داخل Dynamic Query میتوانید هرکاری را انجام دهید که داخل تابع بی معنی هست.
به جای آن میتوانید از توابع CLR که توسط .Net نوشته می شود بهره بگیرید یا منطق برنامه خودتان را تغییر دهید.

شما میخواهید چه کاری انجام دهید که نیاز به اینکار دارید؟ شاید بتوان برای آن راه حل دیگری انتخاب کرد.

esteghamat
دوشنبه 19 آبان 1393, 07:47 صبح
سلام
ممنون از توجه تون. ببينيد من طراح يك بانك اطلاعاتي هستم. با گروهي از همكاران برنامه نويس كار مي كنم. لازم است كه كليه نياز ايشان بدون اينكه به عمق جداول و طراحي دسترسي داشته باشند، محقق شود. مثلا در اين مورد با توجه به پيچيدگي منطق سيستم ، دسترسي هر كاربر بصورت بخشي از شرط يك query قبلا بصورت آماده در يك جدول نگهداري مي شود. و براي برنامه نويس تابعي تهيه شده كه فقط كد كاربر را مي گيرد و ركوردهاي مجاز كاربر را بر م يگرداند. لذا لازم است من در داخل تابع خودم براي تعيين ركوردهاي مجاز هر كاربر، يك Query ديناميك تهيه كنم و در همان تابع اجرا و نتيجه را بصورت يك Table variable برگردانم.
لطفا در صورتيكه راهكار ديگري مي دانيد راهنمايي فرماييد.
با تشكر

حمیدرضاصادقیان
دوشنبه 19 آبان 1393, 08:21 صبح
اولین مشکل اینکار کاهش زیاد سرعت شما خواهد بود.چون تمام Query های شما موقع اجرا Recompile خواهند شد و دائما باید Plan های جدید برای آنها ساخته شود.
اگر منظور شما Row Based Security یا Cell Based Securityهست پیشنهاد میکنم این مقاله (http://technet.microsoft.com/en-us/library/cc966395.aspx) رو مطالعه بفرمایید.

esteghamat
دوشنبه 19 آبان 1393, 14:25 عصر
با سلام
خيلي مايل شدم كه مقاله را بخوانم متاسفانه لينك آن خطا دارد. ايا ممكن است اصلاح فرماييد يا به نحو ديگري در اختيار قرار دهيد. . با تشكر

حمیدرضاصادقیان
دوشنبه 19 آبان 1393, 14:35 عصر
لینک بررسی شد.
مشکلی ندارد.
اگر نتوانستید باز کنید . عبارت
Implementing Row- and Cell-Level Security in Classified Databases Using SQL Serverرا جستجو کنید و مقاله سایت technet.microsoft رو مطالعه بفرمایید.