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

क्या यहां टेबल-वैल्यू पैरामीटर का इस्तेमाल किया जाना चाहिए?

हां, तालिका-मूल्यवान पैरामीटर का उपयोग करें। पहले एक प्रकार बनाएं:

CREATE TYPE dbo.StudentIDs(ID INT PRIMARY KEY);

अब आपकी प्रक्रिया इसका उपयोग कर सकती है (ध्यान दें कि मैंने आपका नेस्टेड IN बदल दिया है उचित जुड़ने के लिए प्रश्न):

CREATE PROCEDURE dbo.MarkStudentsAsDeleted
  @IDs dbo.StudentIDs READONLY
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE s SET IsDeleted = 1
    FROM dbo.Students AS s
    INNER JOIN dbo.Class AS c
    ON s.StudentId = c.StudentId
    INNER JOIN dbo.ClassValueTable AS ct
    ON c.PassId = ct.Id
    WHERE ct.IsDeleted <> 1
    AND EXISTS (SELECT 1 FROM @IDs WHERE StudentID = s.StudentID);
END 
GO

और आपका सी # कोड डेटाटेबल में पास होगा या फिर आपने अल्पविराम से अलग सूची के बजाय सक्रिय आईडी का संग्रह इकट्ठा किया है।

DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Rows.Add(1);
dt.Rows.Add(2);
dt.Rows.Add(3);
dt.Rows.Add(4);

... open connection etc. ...

SqlCommand cmd = new SqlCommand("dbo.MarkStudentsAsDeleted", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter tvp1 = cmd.Parameters.AddWithValue("@IDs", dt);
tvp1.SqlDbType = SqlDbType.Structured;
cmd.ExecuteNonQuery();

... close, dispose, etc. ...

यदि आप संग्रहीत प्रक्रिया में एक स्ट्रिंग पास करने पर जोर देना चाहते हैं, तो आपको एक स्प्लिट फ़ंक्शन का उपयोग करने की आवश्यकता होगी। उदाहरण के लिए:

CREATE FUNCTION dbo.SplitInts
(
   @List       VARCHAR(MAX),
   @Delimiter  VARCHAR(255) = ','
)
RETURNS TABLE
WITH SCHEMABINDING 
AS
  RETURN 
  (  
    SELECT [value] = y.i.value('(./text())[1]', 'int')
    FROM 
    ( 
      SELECT x = CONVERT(XML, '<i>' 
        + REPLACE(@List, @Delimiter, '</i><i>') 
        + '</i>').query('.')
    ) AS a CROSS APPLY x.nodes('i') AS y(i)
  );
GO

अब आपकी संग्रहित प्रक्रिया हो सकती है:

CREATE PROCEDURE dbo.MarkStudentsAsDeleted
  @IDs VARCHAR(MAX)
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE s SET IsDeleted = 1
    FROM dbo.Students AS s
    INNER JOIN dbo.Class AS c
    ON s.StudentId = c.StudentId
    INNER JOIN dbo.ClassValueTable AS ct
    ON c.PassId = ct.Id
    WHERE ct.IsDeleted <> 1
    AND EXISTS (SELECT 1 FROM dbo.SplitInts(@IDs, ',') WHERE Item = s.StudentID);
END 
GO



  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. सी # का उपयोग कर SQL सर्वर सम्मिलित कमांड से वापसी मूल्य

  3. SQL सर्वर (T-SQL) में विभाजन कार्यों की सूची लौटाएँ

  4. SQL सर्वर में एक विशिष्ट लॉगिन के लिए एक साथ उपयोगकर्ता सत्रों को सीमित करना

  5. SQL सर्वर कन्वर्ट एक कॉलम का चयन करें और इसे एक स्ट्रिंग में बदलें