تعیین نام جدول بوسیله متغیر در SQL Server

mohsen2 هفته قبل
ارسال شده در
sql

هنگامی که می‌خواهید از نام جدول به صورت داینامیک در یک کوئری 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 استفاده کنید.

رای
0
ارسال نظر
مرتب سازی:
اولین نفری باشید که نظر می دهید!