تعیین نام جدول بوسیله متغیر در SQL Server
هنگامی که میخواهید از نام جدول به صورت داینامیک در یک کوئری SQL استفاده کنید، به دلیل محدودیتهای SQL، نمیتوانید به سادگی از متغیرهای معمولی استفاده کرد. در عوض، نیاز است تا کل کوئری را بهصورت داینامیک ایجاد کرده و از sp_executesql
یا EXEC
برای اجرا کردن آن استفاده کنید.
برای ایجاد یک نام جدول داینامیک، میتوانید از کد زیر استفاده کنید:
DECLARE @tablename NVARCHAR(50);
SET @tablename = 'test';
EXEC('SELECT * FROM ' + QUOTENAME(@tablename));
در این مثال، ابتدا نام جدول به متغیر نسبت داده میشود و سپس با استفاده از EXEC
پرسوجو اجرا میشود.
اگر بخواهید مقداری را از خروجی این پرسوجو (به عنوان مثال تعداد ردیفها) را دریافت کنید، میتوانید آن را با استفاده از روشهای زیر انجام دهید:
DECLARE @count INT;
DECLARE @sSQL NVARCHAR(MAX);
SET @sSQL = 'SELECT @count = COUNT(*) FROM ' + QUOTENAME(@tablename);
EXEC sp_executesql @sSQL, N'@count INT OUTPUT', @count OUTPUT;
SELECT @count AS RowCount;
در این کد، با استفاده از یک متغیر @count
، تعداد ردیفها را دریافت کرده و آن را به عنوان یک خروجی نشان میدهید.
توجه داشته باشید که استفاده از QUOTENAME
برای جلوگیری از حملات SQL Injection بسیار مهم است، زیرا به شما اطمینان میدهد که نام جدول به درستی و به صورت ایمن استفاده میشود.
اگر بخواهید این کد را در یک پروسیجر قرار دهید، میتوانید به روش زیر عمل کنید:
CREATE PROCEDURE [dbo].[GetByName]
@TableName NVARCHAR(100),
@RowCount INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sSQL NVARCHAR(500);
SET @sSQL = N'SELECT @RowCount = COUNT(*) FROM ' + QUOTENAME(@TableName);
EXEC sp_executesql @sSQL, N'@RowCount INT OUTPUT', @RowCount OUTPUT;
END
این پروسیجر میتواند برای دریافت تعداد ردیفهای موجود در جدول داینامیک فراخوانی شود.
در نهایت، همواره به یاد داشته باشید که در کار با SQL داینامیک، مسائل امنیتی و کارایی را در نظر داشته باشید و از روشهای ایمن برای جلوگیری از حملات SQL Injection استفاده کنید.