Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

सी # और एसक्यूएल सर्वर - संग्रहित प्रक्रिया का उपयोग करके एक ही बार में एकाधिक पंक्तियों को हटाने का सबसे अच्छा तरीका

आप इसे सौंपने के लिए तालिका मूल्यवान पैरामीटर का उपयोग कर सकते हैं। अनुप्रयोग परत कुछ इस तरह दिखाई देगी

सी#

var tvp = new DataTable();
tvp.Columns.Add("Id", typeof(int));

foreach(var id in RecIdsToDelete)
    tvp.Rows.Add(new {id});

var connection = new SqlConnection("your connection string");

var delete = new SqlCommand("your stored procedure name", connection)
{
  CommandType = CommandType.StoredProcedure
};

delete
  .Parameters
  .AddWithValue("@ids", tvp)
  .SqlDbType = SqlDbType.Structured;

delete.ExecuteNonQuery();

एसक्यूएल

IF NOT EXISTS(SELECT * FROM sys.table_types WHERE name = 'IDList')
BEGIN
    CREATE TYPE IDList AS TABLE(ID INTEGER)
END


CREATE PROCEDURE School.GroupStudentDelete
(                                         
        @IDS IDLIST READONLY      
)                                         
AS

SET NOCOUNT ON;

BEGIN TRY
        BEGIN TRANSACTION

        DECLARE @Results TABLE(id INTEGER)

        DELETE 
        FROM TblName 
        WHERE Id IN (SELECT ID FROM @IDS)        

        COMMIT TRANSACTION
END TRY
BEGIN CATCH
        PRINT ERROR_MESSAGE();

        ROLLBACK TRANSACTION
        THROW; -- Rethrow exception
END CATCH
GO

स्ट्रिंग्स के निर्माण पर इस दृष्टिकोण के कई फायदे हैं

  • आप एप्लिकेशन परत में प्रश्न बनाने से बचते हैं, चिंताओं का एक पृथक्करण बनाते हैं
  • आप निष्पादन योजनाओं का अधिक आसानी से परीक्षण कर सकते हैं और प्रश्नों को अनुकूलित कर सकते हैं
  • आप SQL इंजेक्शन हमलों के प्रति कम संवेदनशील हैं, क्योंकि आपका दिया गया दृष्टिकोण IN क्लॉज बनाने के लिए एक पैरामैटरीकृत क्वेरी का उपयोग करने में सक्षम नहीं होगा
  • कोड अधिक पठनीय और उदाहरणात्मक है
  • आप अत्यधिक लंबे तार नहीं बनाते हैं

प्रदर्शन

बड़े डेटासेट पर टीवीपी के प्रदर्शन के बारे में कुछ विचार हैं।

क्योंकि टीवीपी चर हैं, वे आंकड़े संकलित नहीं करते हैं। इसका मतलब है कि क्वेरी ऑप्टिमाइज़र कभी-कभी निष्पादन योजना को विफल कर सकता है। अगर ऐसा होता है तो कुछ विकल्प हैं:

  • सेट OPTION (RECOMPILE) किसी भी टीवीपी विवरण पर जहां अनुक्रमण एक मुद्दा है
  • TVP को स्थानीय टेंपरेचर में लिखें और वहां इंडेक्सिंग सेट करें

यहां टीवीपी पर एक बेहतरीन लेख दिया गया है प्रदर्शन के विचारों पर एक अच्छे खंड के साथ, और कब क्या उम्मीद की जाए।

इसलिए यदि आप स्ट्रिंग पैरामीटर्स पर सीमाएं मारने के बारे में चिंतित हैं, तो टेबल वैल्यू पैरामीटर जाने का रास्ता हो सकता है। लेकिन अंत में, आप जिस डेटा सेट के साथ काम कर रहे हैं, उसके बारे में अधिक जाने बिना कहना मुश्किल है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर एजेंट कार्य स्वचालित रूप से कैसे प्रारंभ करें

  2. टी-एसक्यूएल में शब्दों के क्रम को उलट दें

  3. एकाधिक स्तंभ समुच्चय के साथ SQL सर्वर पिवट तालिका

  4. SQL सर्वर, डेटा हानि के बिना तालिका बनाने के बाद ऑटो वेतन वृद्धि कैसे सेट करें?

  5. लेन-देन और लेन-देन के बीच का अंतर