কিছু লগ ফাইলগুলিতে ক্যোয়ারির ইতিহাস সঞ্চিত আছে? যদি হ্যাঁ, তবে আপনি কীভাবে তাদের অবস্থানটি সন্ধান করতে পারেন? যদি তা না হয় তবে আপনি কীভাবে এটি দেখতে চান সে সম্পর্কে কোনও পরামর্শ দিতে পারেন?
কিছু লগ ফাইলগুলিতে ক্যোয়ারির ইতিহাস সঞ্চিত আছে? যদি হ্যাঁ, তবে আপনি কীভাবে তাদের অবস্থানটি সন্ধান করতে পারেন? যদি তা না হয় তবে আপনি কীভাবে এটি দেখতে চান সে সম্পর্কে কোনও পরামর্শ দিতে পারেন?
উত্তর:
[যেহেতু এই প্রশ্নটি সম্ভবত নকল হিসাবে বন্ধ হবে]]
যদি এসকিউএল সার্ভারটি পুনরায় চালু না করা হয় (এবং পরিকল্পনাটি উচ্ছেদ করা হয়নি, ইত্যাদি), আপনি পরিকল্পনা ক্যাশে ক্যোয়ারীটি সন্ধান করতে সক্ষম হতে পারেন।
SELECT t.[text]
FROM sys.dm_exec_cached_plans AS p
CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t
WHERE t.[text] LIKE N'%something unique about your query%';
ম্যানেজমেন্ট স্টুডিও ক্রাশ হওয়ার কারণে আপনি যদি ফাইলটি হারিয়ে ফেলেন তবে আপনি পুনরুদ্ধার ফাইলগুলি এখানে পেতে সক্ষম হতে পারেন:
C:\Users\<you>\Documents\SQL Server Management Studio\Backup Files\
অন্যথায় আপনাকে এড হার্পারের উত্তরে উল্লিখিত এসএসএমএস সরঞ্জাম প্যাকের মতো আপনার ক্যোয়ারির ইতিহাস বাঁচাতে সহায়তা করার জন্য আপনাকে আরও কিছু ব্যবহার করতে হবে - যদিও এটি এসকিউএল সার্ভার ২০১২+ তে নিখরচায় নয়। অথবা আপনি আপনার লগইন বা হোস্টের নামের উপর ফিল্টারযুক্ত কিছু হালকা ওজনের ট্রেসিং সেট আপ করতে পারেন (তবে দয়া করে এটির জন্য প্রোফাইলার নয়, একটি সার্ভার-সাইড ট্রেস ব্যবহার করুন)।
@ নেনাড-জিভকোভিক যেমন মন্তব্য করেছেন, তাতে যোগদান sys.dm_exec_query_stats
এবং আদেশ দেওয়ার জন্য এটি সহায়ক হতে পারে last_execution_time
:
SELECT t.[text], s.last_execution_time
FROM sys.dm_exec_cached_plans AS p
INNER JOIN sys.dm_exec_query_stats AS s
ON p.plan_handle = s.plan_handle
CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t
WHERE t.[text] LIKE N'%something unique about your query%'
ORDER BY s.last_execution_time DESC;
sys.dm_exec_query_stats
এবং অনুসন্ধান বা অর্ডার করতে সহায়তা করতে পারেlast_execution_time
দেরীতে তবে আশাবাদী যেহেতু এটি আরও বিশদ যুক্ত করে ...
ডিফল্টরূপে এসএসএমএসে চালিত ক্যোয়ারী দেখার কোনও উপায় নেই। যদিও বেশ কয়েকটি বিকল্প রয়েছে।
লেনদেন লগ পড়া - এটি করা সহজ কাজ নয় কারণ এটি মালিকানা বিন্যাসে রয়েছে। তবে আপনার যদি quতিহাসিকভাবে কার্যকর করা প্রশ্নগুলি দেখার দরকার হয় (সलेक्ट ছাড়া) এটিই একমাত্র উপায়।
আপনি এপেক্সএসকিউএল লগ এবং এসকিউএল লগ রেসকিউ (ফ্রি তবে এসকিউএল 2000 কেবলমাত্র) এর জন্য তৃতীয় পক্ষের সরঞ্জামগুলি ব্যবহার করতে পারেন । আরও তথ্যের জন্য এই থ্রেডটি এখানে দেখুন এসকিউএল সার্ভার লেনদেন লগ এক্সপ্লোরার / বিশ্লেষক
এসকিউএল সার্ভার প্রোফাইলার - আপনি কেবল নিরীক্ষণ শুরু করতে চান এবং এর আগে যা ঘটেছিল তাতে আপনি আগ্রহী না হলে সবচেয়ে উপযুক্ত। আপনার প্রয়োজনীয় লেনদেনগুলি নির্বাচন করতে আপনি ফিল্টার ব্যবহার করেছেন তা নিশ্চিত করুন। অন্যথায় আপনি খুব দ্রুত টন ডেটা দিয়ে শেষ করবেন।
এসকিউএল সার্ভারের ট্রেস - আপনি যদি সমস্ত বা সর্বাধিক কমান্ডগুলি ক্যাপচার করতে চান এবং সেগুলি পরে ট্রেড করতে পারেন এমন ট্রেস ফাইলে রাখতে চান তবে সবচেয়ে উপযুক্ত।
ট্রিগারস - আপনি যদি ডিএমএল ক্যাপচার করতে চান তবে সেরা উপযুক্ত (নির্বাচন ব্যতীত) এবং এগুলি কোথাও ডাটাবেসে সঞ্চয় করতে পারেন
এসএসএমএস সরঞ্জাম প্যাক অন্যান্য জিনিসের মধ্যে সম্পাদনের ইতিহাস রেকর্ড করতে কার্যকারিতা যুক্ত করে।
অন্যরা যেমন উল্লেখ করেছে, আপনি এসকিউএল প্রোফাইলার ব্যবহার করতে পারেন তবে আপনি sp_trace_ * সিস্টেমের সঞ্চিত পদ্ধতিগুলির মাধ্যমে এর কার্যকারিতাটিও অর্জন করতে পারেন। উদাহরণস্বরূপ, এই এসকিউএল স্নিপেট (কমপক্ষে 2000 এ; আমি মনে করি এটি এসকিউএল 2008 এর জন্য একই তবে তবে আপনাকে ডাবল-চেক করতে হবে) চালাতে 10 সেকেন্ডের বেশি সময় নেবে এমন সমস্ত প্রশ্নের জন্য ক্যাচ RPC:Completed
এবং SQL:BatchCompleted
ইভেন্টগুলি আউটপুট সংরক্ষণ করবে একটি ট্রেসফিল যা আপনি পরবর্তী তারিখে এসকিউএল প্রোফাইলারে খুলতে পারবেন:
DECLARE @TraceID INT
DECLARE @ON BIT
DECLARE @RetVal INT
SET @ON = 1
exec @RetVal = sp_trace_create @TraceID OUTPUT, 2, N'Y:\TraceFile.trc'
print 'This trace is Trace ID = ' + CAST(@TraceID AS NVARCHAR)
print 'Return value = ' + CAST(@RetVal AS NVARCHAR)
-- 10 = RPC:Completed
exec sp_trace_setevent @TraceID, 10, 1, @ON -- Textdata
exec sp_trace_setevent @TraceID, 10, 3, @ON -- DatabaseID
exec sp_trace_setevent @TraceID, 10, 12, @ON -- SPID
exec sp_trace_setevent @TraceID, 10, 13, @ON -- Duration
exec sp_trace_setevent @TraceID, 10, 14, @ON -- StartTime
exec sp_trace_setevent @TraceID, 10, 15, @ON -- EndTime
-- 12 = SQL:BatchCompleted
exec sp_trace_setevent @TraceID, 12, 1, @ON -- Textdata
exec sp_trace_setevent @TraceID, 12, 3, @ON -- DatabaseID
exec sp_trace_setevent @TraceID, 12, 12, @ON -- SPID
exec sp_trace_setevent @TraceID, 12, 13, @ON -- Duration
exec sp_trace_setevent @TraceID, 12, 14, @ON -- StartTime
exec sp_trace_setevent @TraceID, 12, 15, @ON -- EndTime
-- Filter for duration [column 13] greater than [operation 2] 10 seconds (= 10,000ms)
declare @duration bigint
set @duration = 10000
exec sp_trace_setfilter @TraceID, 13, 0, 2, @duration
আপনি বুকস অনলাইন থেকে প্রতিটি ট্রেস-ইভেন্ট, কলামগুলি ইত্যাদির জন্য আইডি খুঁজে পেতে পারেন; কেবল sp_trace_create , sp_trace_setevent এবং sp_trace_setfiler স্প্রোকগুলি অনুসন্ধান করুন। তারপরে আপনি ট্রেসটি নিম্নরূপে নিয়ন্ত্রণ করতে পারেন:
exec sp_trace_setstatus 15, 0 -- Stop the trace
exec sp_trace_setstatus 15, 1 -- Start the trace
exec sp_trace_setstatus 15, 2 -- Close the trace file and delete the trace settings
... যেখানে '15' হ'ল ট্রেস আইডি (যেমন sp_trace_create দ্বারা রিপোর্ট করা হয়েছে, যা উপরে প্রথম স্ক্রিপ্টটি কিক আউট করেছে)।
কী ট্রেসগুলি চলছে তা দেখতে আপনি যাচাই করতে পারেন:
select * from ::fn_trace_getinfo(default)
আমি কেবল সাবধানতার সাথেই বলব - এটি আপনার সিস্টেমে কতটা চাপ পড়বে তা আমি জানি না; এটি কিছু যুক্ত করবে, তবে "কিছু" কতটা বড় তা সম্ভবত আপনার সার্ভারে কতটা ব্যস্ত তা নির্ভর করে।
আমি কোনও এসকিউএল সার্ভারে অ্যাপ্লিকেশন ক্রিয়াকলাপ সন্ধানের জন্য নীচের ক্যোয়ারীটি ব্যবহার করি যার মধ্যে ট্রেস প্রোফাইলার সক্ষম নেই। পদ্ধতিটি ডিএমভির পরিবর্তে ক্যোয়ারী স্টোর (এসকিউএল সার্ভার 2016+) ব্যবহার করে। এটি historicalতিহাসিক ডেটা তত দ্রুত তাত্ক্ষণিকভাবে অনুসন্ধান করার আরও ভাল ক্ষমতা দেয়। সংক্ষিপ্ত-চলমান প্রশ্নগুলি ক্যাপচার করার পক্ষে এটি অত্যন্ত দক্ষ যা sp_Wo / sp_Woisactive দ্বারা ক্যাপচার করা যায় না।
/* Adjust script to your needs.
Run full script (F5) -> Interact with UI -> Run full script again (F5)
Output will contain the queries completed in that timeframe.
*/
/* Requires Query Store to be enabled:
ALTER DATABASE <db> SET QUERY_STORE = ON
ALTER DATABASE <db> SET QUERY_STORE (OPERATION_MODE = READ_WRITE, MAX_STORAGE_SIZE_MB = 100000)
*/
USE <db> /* Select your DB */
IF OBJECT_ID('tempdb..#lastendtime') IS NULL
SELECT GETUTCDATE() AS dt INTO #lastendtime
ELSE IF NOT EXISTS (SELECT * FROM #lastendtime)
INSERT INTO #lastendtime VALUES (GETUTCDATE())
;WITH T AS (
SELECT
DB_NAME() AS DBName
, s.name + '.' + o.name AS ObjectName
, qt.query_sql_text
, rs.runtime_stats_id
, p.query_id
, p.plan_id
, CAST(p.last_execution_time AS DATETIME) AS last_execution_time
, CASE WHEN p.last_execution_time > #lastendtime.dt THEN 'X' ELSE '' END AS New
, CAST(rs.last_duration / 1.0e6 AS DECIMAL(9,3)) last_duration_s
, rs.count_executions
, rs.last_rowcount
, rs.last_logical_io_reads
, rs.last_physical_io_reads
, q.query_parameterization_type_desc
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY plan_id, runtime_stats_id ORDER BY runtime_stats_id DESC) AS recent_stats_in_current_priod
FROM sys.query_store_runtime_stats
) AS rs
INNER JOIN sys.query_store_runtime_stats_interval AS rsi ON rsi.runtime_stats_interval_id = rs.runtime_stats_interval_id
INNER JOIN sys.query_store_plan AS p ON p.plan_id = rs.plan_id
INNER JOIN sys.query_store_query AS q ON q.query_id = p.query_id
INNER JOIN sys.query_store_query_text AS qt ON qt.query_text_id = q.query_text_id
LEFT OUTER JOIN sys.objects AS o ON o.object_id = q.object_id
LEFT OUTER JOIN sys.schemas AS s ON s.schema_id = o.schema_id
CROSS APPLY #lastendtime
WHERE rsi.start_time <= GETUTCDATE() AND GETUTCDATE() < rsi.end_time
AND recent_stats_in_current_priod = 1
/* Adjust your filters: */
-- AND (s.name IN ('<myschema>') OR s.name IS NULL)
UNION
SELECT NULL,NULL,NULL,NULL,NULL,NULL,dt,NULL,NULL,NULL,NULL,NULL,NULL, NULL
FROM #lastendtime
)
SELECT * FROM T
WHERE T.query_sql_text IS NULL OR T.query_sql_text NOT LIKE '%#lastendtime%' -- do not show myself
ORDER BY last_execution_time DESC
TRUNCATE TABLE #lastendtime
INSERT INTO #lastendtime VALUES (GETUTCDATE())
SELECT deqs.last_execution_time AS [Time], dest.text AS [Query], dest.*
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
WHERE dest.dbid = DB_ID('msdb')
ORDER BY deqs.last_execution_time DESC
এটি আপনাকে কখন কোনও ক্যোয়ারী চালানো হয়েছিল তার সময় এবং তারিখটি দেখানো উচিত
আপনার যদি প্রয়োজন হয় তবে এসকিউএল প্রোফাইলার দ্বারা এসকিউএল কোয়েরিগুলি পর্যবেক্ষণ করতে পারেন
সিস্টেমের ভিউগুলি ব্যবহার করে অনুসন্ধানের ইতিহাসটি দেখা যায়:
উদাহরণস্বরূপ, নিম্নলিখিত কোয়েরি ব্যবহার করে:
select top(100)
creation_time,
last_execution_time,
execution_count,
total_worker_time/1000 as CPU,
convert(money, (total_worker_time))/(execution_count*1000)as [AvgCPUTime],
qs.total_elapsed_time/1000 as TotDuration,
convert(money, (qs.total_elapsed_time))/(execution_count*1000)as [AvgDur],
total_logical_reads as [Reads],
total_logical_writes as [Writes],
total_logical_reads+total_logical_writes as [AggIO],
convert(money, (total_logical_reads+total_logical_writes)/(execution_count + 0.0)) as [AvgIO],
[sql_handle],
plan_handle,
statement_start_offset,
statement_end_offset,
plan_generation_num,
total_physical_reads,
convert(money, total_physical_reads/(execution_count + 0.0)) as [AvgIOPhysicalReads],
convert(money, total_logical_reads/(execution_count + 0.0)) as [AvgIOLogicalReads],
convert(money, total_logical_writes/(execution_count + 0.0)) as [AvgIOLogicalWrites],
query_hash,
query_plan_hash,
total_rows,
convert(money, total_rows/(execution_count + 0.0)) as [AvgRows],
total_dop,
convert(money, total_dop/(execution_count + 0.0)) as [AvgDop],
total_grant_kb,
convert(money, total_grant_kb/(execution_count + 0.0)) as [AvgGrantKb],
total_used_grant_kb,
convert(money, total_used_grant_kb/(execution_count + 0.0)) as [AvgUsedGrantKb],
total_ideal_grant_kb,
convert(money, total_ideal_grant_kb/(execution_count + 0.0)) as [AvgIdealGrantKb],
total_reserved_threads,
convert(money, total_reserved_threads/(execution_count + 0.0)) as [AvgReservedThreads],
total_used_threads,
convert(money, total_used_threads/(execution_count + 0.0)) as [AvgUsedThreads],
case
when sql_handle IS NULL then ' '
else(substring(st.text,(qs.statement_start_offset+2)/2,(
case
when qs.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2
else qs.statement_end_offset
end - qs.statement_start_offset)/2 ))
end as query_text,
db_name(st.dbid) as database_name,
object_schema_name(st.objectid, st.dbid)+'.'+object_name(st.objectid, st.dbid) as [object_name],
sp.[query_plan]
from sys.dm_exec_query_stats as qs with(readuncommitted)
cross apply sys.dm_exec_sql_text(qs.[sql_handle]) as st
cross apply sys.dm_exec_query_plan(qs.[plan_handle]) as sp
WHERE st.[text] LIKE '%query%'
বর্তমান চলমান প্রশ্নগুলি নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করে দেখা যায়:
select ES.[session_id]
,ER.[blocking_session_id]
,ER.[request_id]
,ER.[start_time]
,DateDiff(second, ER.[start_time], GetDate()) as [date_diffSec]
, COALESCE(
CAST(NULLIF(ER.[total_elapsed_time] / 1000, 0) as BIGINT)
,CASE WHEN (ES.[status] <> 'running' and isnull(ER.[status], '') <> 'running')
THEN DATEDIFF(ss,0,getdate() - nullif(ES.[last_request_end_time], '1900-01-01T00:00:00.000'))
END
) as [total_time, sec]
, CAST(NULLIF((CAST(ER.[total_elapsed_time] as BIGINT) - CAST(ER.[wait_time] AS BIGINT)) / 1000, 0 ) as bigint) as [work_time, sec]
, CASE WHEN (ER.[status] <> 'running' AND ISNULL(ER.[status],'') <> 'running')
THEN DATEDIFF(ss,0,getdate() - nullif(ES.[last_request_end_time], '1900-01-01T00:00:00.000'))
END as [sleep_time, sec] --Время сна в сек
, NULLIF( CAST((ER.[logical_reads] + ER.[writes]) * 8 / 1024 as numeric(38,2)), 0) as [IO, MB]
, CASE ER.transaction_isolation_level
WHEN 0 THEN 'Unspecified'
WHEN 1 THEN 'ReadUncommited'
WHEN 2 THEN 'ReadCommited'
WHEN 3 THEN 'Repetable'
WHEN 4 THEN 'Serializable'
WHEN 5 THEN 'Snapshot'
END as [transaction_isolation_level_desc]
,ER.[status]
,ES.[status] as [status_session]
,ER.[command]
,ER.[percent_complete]
,DB_Name(coalesce(ER.[database_id], ES.[database_id])) as [DBName]
, SUBSTRING(
(select top(1) [text] from sys.dm_exec_sql_text(ER.[sql_handle]))
, ER.[statement_start_offset]/2+1
, (
CASE WHEN ((ER.[statement_start_offset]<0) OR (ER.[statement_end_offset]<0))
THEN DATALENGTH ((select top(1) [text] from sys.dm_exec_sql_text(ER.[sql_handle])))
ELSE ER.[statement_end_offset]
END
- ER.[statement_start_offset]
)/2 +1
) as [CURRENT_REQUEST]
,(select top(1) [text] from sys.dm_exec_sql_text(ER.[sql_handle])) as [TSQL]
,(select top(1) [objectid] from sys.dm_exec_sql_text(ER.[sql_handle])) as [objectid]
,(select top(1) [query_plan] from sys.dm_exec_query_plan(ER.[plan_handle])) as [QueryPlan]
,NULL as [event_info]--(select top(1) [event_info] from sys.dm_exec_input_buffer(ES.[session_id], ER.[request_id])) as [event_info]
,ER.[wait_type]
,ES.[login_time]
,ES.[host_name]
,ES.[program_name]
,cast(ER.[wait_time]/1000 as decimal(18,3)) as [wait_timeSec]
,ER.[wait_time]
,ER.[last_wait_type]
,ER.[wait_resource]
,ER.[open_transaction_count]
,ER.[open_resultset_count]
,ER.[transaction_id]
,ER.[context_info]
,ER.[estimated_completion_time]
,ER.[cpu_time]
,ER.[total_elapsed_time]
,ER.[scheduler_id]
,ER.[task_address]
,ER.[reads]
,ER.[writes]
,ER.[logical_reads]
,ER.[text_size]
,ER.[language]
,ER.[date_format]
,ER.[date_first]
,ER.[quoted_identifier]
,ER.[arithabort]
,ER.[ansi_null_dflt_on]
,ER.[ansi_defaults]
,ER.[ansi_warnings]
,ER.[ansi_padding]
,ER.[ansi_nulls]
,ER.[concat_null_yields_null]
,ER.[transaction_isolation_level]
,ER.[lock_timeout]
,ER.[deadlock_priority]
,ER.[row_count]
,ER.[prev_error]
,ER.[nest_level]
,ER.[granted_query_memory]
,ER.[executing_managed_code]
,ER.[group_id]
,ER.[query_hash]
,ER.[query_plan_hash]
,EC.[most_recent_session_id]
,EC.[connect_time]
,EC.[net_transport]
,EC.[protocol_type]
,EC.[protocol_version]
,EC.[endpoint_id]
,EC.[encrypt_option]
,EC.[auth_scheme]
,EC.[node_affinity]
,EC.[num_reads]
,EC.[num_writes]
,EC.[last_read]
,EC.[last_write]
,EC.[net_packet_size]
,EC.[client_net_address]
,EC.[client_tcp_port]
,EC.[local_net_address]
,EC.[local_tcp_port]
,EC.[parent_connection_id]
,EC.[most_recent_sql_handle]
,ES.[host_process_id]
,ES.[client_version]
,ES.[client_interface_name]
,ES.[security_id]
,ES.[login_name]
,ES.[nt_domain]
,ES.[nt_user_name]
,ES.[memory_usage]
,ES.[total_scheduled_time]
,ES.[last_request_start_time]
,ES.[last_request_end_time]
,ES.[is_user_process]
,ES.[original_security_id]
,ES.[original_login_name]
,ES.[last_successful_logon]
,ES.[last_unsuccessful_logon]
,ES.[unsuccessful_logons]
,ES.[authenticating_database_id]
,ER.[sql_handle]
,ER.[statement_start_offset]
,ER.[statement_end_offset]
,ER.[plan_handle]
,NULL as [dop]--ER.[dop]
,coalesce(ER.[database_id], ES.[database_id]) as [database_id]
,ER.[user_id]
,ER.[connection_id]
from sys.dm_exec_requests ER with(readuncommitted)
right join sys.dm_exec_sessions ES with(readuncommitted)
on ES.session_id = ER.session_id
left join sys.dm_exec_connections EC with(readuncommitted)
on EC.session_id = ES.session_id
where ER.[status] in ('suspended', 'running', 'runnable')
or exists (select top(1) 1 from sys.dm_exec_requests as ER0 where ER0.[blocking_session_id]=ES.[session_id])
এই অনুরোধটি সমস্ত সক্রিয় অনুরোধগুলি এবং সেই সমস্ত অনুরোধগুলি প্রদর্শন করে যা স্পষ্টভাবে সক্রিয় অনুরোধগুলিকে অবরুদ্ধ করে।
এগুলি এবং অন্যান্য দরকারী স্ক্রিপ্টগুলি এসআরভি ডাটাবেসে উপস্থাপনা হিসাবে প্রয়োগ করা হয় , যা অবাধে বিতরণ করা হয়। উদাহরণস্বরূপ, প্রথম স্ক্রিপ্ট দৃশ্য থেকে এসেছিলেন [INF]। [VBigQuery] , এবং দ্বিতীয় দৃশ্য থেকে এসেছিলেন [INF]। [VRequests] ।
কোয়েরির ইতিহাসের জন্য বিভিন্ন তৃতীয় পক্ষের সমাধানও রয়েছে। আমি ব্যবহার ক্যোয়ারী ম্যানেজার থেকে Dbeaver : এবং ক্যোয়ারী এক্সেকিউশন ইতিহাস থেকে এসকিউএল সরঞ্জাম , যা এমবেড করা হয় SSMS :
এসএসএমএসের বাক্সের বাইরে এই বৈশিষ্ট্যটি বিদ্যমান নেই।
আপনি যদি এসএসএমএস 18 বা আরও বেশি ব্যবহার করে থাকেন তবে আপনি এসএসএমএসপ্লাস চেষ্টা করতে চাইতে পারেন।
এটিতে ক্যোয়ারির ইতিহাস বৈশিষ্ট্য রয়েছে।
https://github.com/akarzazi/SSMSPlus
দাবি অস্বীকার: আমি লেখক।
আপনার আগ্রহী প্রশ্নগুলি যদি গতিশীল প্রশ্নগুলি হয় যা মাঝেমধ্যে ব্যর্থ হয় তবে আপনি গতিশীল বিবৃতি তৈরি হওয়ার সময় আপনি এসকিউএল এবং তারিখের সময় এবং ব্যবহারকারীকে একটি টেবিলে লগ করতে পারেন। এটি কেস-কেস কেস ভিত্তিতে করা হবে যদিও এটির জন্য নির্দিষ্ট প্রোগ্রামিং হওয়া প্রয়োজন এবং এটি লিটেলের অতিরিক্ত প্রক্রিয়াকরণের সময়ও লাগে, তাই কেবলমাত্র সেই কয়েকটি প্রশ্নের জন্যই আপনি যা করছেন সবচেয়ে বেশি উদ্বিগ্ন। তবে নির্দিষ্ট বিবৃতি কার্যকর করার জন্য যখন আপনি কেবলমাত্র মাসে একবার এটি ব্যর্থ হয় তা অনুসন্ধান করার চেষ্টা করা হলে তা কার্যকরভাবে কার্যকর হয়। ডায়নামিক ক্যোয়ারীগুলি পুরোপুরি পরীক্ষা করা শক্ত এবং কখনও কখনও আপনি একটি নির্দিষ্ট ইনপুট মান পান যা কেবলমাত্র কাজ করবে না এবং এসকিউএল তৈরি হওয়ার সময় এই লগিংটি করা প্রায়শই সবচেয়ে ভাল উপায় যা বিশেষত নির্মিত স্কয়ারে কী ছিল তা দেখার সেরা উপায়।
বাক্সটির সামান্য বাইরে পদ্ধতিটি অটোহটকিতে কোনও সমাধান স্ক্রিপ্ট আপ করা। আমি এটি ব্যবহার করি এবং এটি নিখুঁত নয়, তবে কাজ করে এবং নিখরচায়। মূলত, এই স্ক্রিপ্টের একটি হটকী নির্ধারণ করার CTRL+ + SHIFT+ +R যা নির্বাচিত এসকিউএলকে এসএসএমএসে ( CTRL+ C) অনুলিপি করবে , একটি ডেটস্ট্যাম্প এসকিউএল ফাইল সংরক্ষণ করবে এবং তারপরে হাইলাইট করা ক্যোয়ারী কার্যকর করবে ( F5)। আপনি যদি এএইচকে স্ক্রিপ্ট ব্যবহার না করে থাকেন তবে শীর্ষস্থানীয় সেমিকোলন একটি মন্তব্য।
;CTRL+SHIFT+R to run a query that is first saved off
^+r::
;Copy
Send, ^c
; Set variables
EnvGet, HomeDir, USERPROFILE
FormatTime, DateString,,yyyyMMdd
FormatTime, TimeString,,hhmmss
; Make a spot to save the clipboard
FileCreateDir %HomeDir%\Documents\sqlhist\%DateString%
FileAppend, %Clipboard%, %HomeDir%\Documents\sqlhist\%DateString%\%TimeString%.sql
; execute the query
Send, {f5}
Return
সর্বাধিক সীমাবদ্ধতা হ'ল আপনি কীবোর্ড শর্টকাট ব্যবহার না করে "এক্সিকিউট" ক্লিক করলে এই স্ক্রিপ্টটি কাজ করবে না এবং এই স্ক্রিপ্টটি পুরো ফাইলটি সংরক্ষণ করবে না - কেবলমাত্র নির্বাচিত পাঠ্য। তবে, আপনি কোয়েরিটি কার্যকর করতে স্ক্রিপ্টটি সর্বদা সংশোধন করতে পারবেন এবং তারপরে অনুলিপি / সংরক্ষণের আগে সমস্ত ( CTRL+ A) নির্বাচন করুন।
"ফাইলগুলিতে সন্ধান করুন" বৈশিষ্ট্য সহ একটি আধুনিক সম্পাদক ব্যবহার করা আপনাকে আপনার এসকিউএল ইতিহাস অনুসন্ধান করতে দেয়। এমনকি আপনি আপনার অভিনবত্তা পেতে পারেন এবং আপনার প্রশ্নের অনুসন্ধানের জন্য আপনার ফাইলগুলিকে একটি এসকিউএল 3 ডাটাবেসে স্ক্র্যাপ করতে পারেন।