چگونه می توان یک آرایه را به داخل یک store procedure فرستاد و اینکه پارامتر آرایه در داخل store procedure چطور باید تعریف شود و چگونه می توان از آن استفاده کرد؟
چگونه می توان یک آرایه را به داخل یک store procedure فرستاد و اینکه پارامتر آرایه در داخل store procedure چطور باید تعریف شود و چگونه می توان از آن استفاده کرد؟
این سوال من هم هست.
به جوابهایی هم رسیدم اما گیج شدم.
من می خوام یک آرایه شامل آی دی های یک جدول رو با استور پروسیجر به اسکیوال بفرستم و در اونجا با پیمایش این آرایه به ازای هر عنصر اینزرت انجام بدم.
ممنون میشم شسته و رفته و کامل یکی جواب بده.
از XML هم نمی خوام استفاده کن
با سلام
شما برای اینکار باید ابتدا یک User defined table type را به مانند زیر ایجاد کنید.
CREATE TYPE TVP AS TABLE
(
ID INT
)
سپس این User defined table type ساخته شده را به صورت پارامتر به پروسیجر به مانند زیر بیافزاید
CREATE PROCEDURE SP
@T TVP READONLY
AS
BEGIN
SELECT * FROM @T
END
توجه داشته باشید پارامتر را فقط به صورت readonly می توانید تعریف کنید.
با استفاده از این پارامتر داده ها را به صورت آرایه یا جدول می توانید به پروسیجر بفرستید.
موفق باشید./
سوالی که داشتم اینه که اگه قرار باشه با استفاده از این روش علاوه بر یک دیتاتیبل یک ستونه، چند متغیر دیگه که می خوام برای تمامی دیتاتیبل تکرار بشه همزمان اینزرت بشه باید چه کرد.
می دونم می توان در همان سمت سی شارپ به دیتاتیبل اضافه کرد. اما می خوام سمت SQL انجام شود چون برنامه تحت شبکه و وب هست به صرفه نیست که این حجم ترافیک ایجاد شود.
برای اینکه منظورم رو بهتر متوجه شوید به شبه کد که البته اشتباه است توجه کنید.
create PROCEDURE ADDM
(
@MyTable MyType READONLY,
@text nvarchar(max),
@Datetime nvarchar(50)
)
AS
INSERT INTO Users(UserID, Tex,DatTime)Values
(SELECT UserID FROM @MyTable, @text,@Datetime)
منظورم این است که دیتایتبل فرستاده شده یک فیلد باشد.
اگر منظورتون رو درست متوجه شده باشم، برای کاهش حجم user defined table type می خواهید ستون های تکراری رو به صورت پارامتر بفرستید، قطعا این کار صحیح تر خواهد بود.
و البته درج به صورت زیر خواهد شد.
INSERT INTO Users(UserID, Tex,DatTime)
SELECT UserID, @text,@Datetime FROM @MyTable
حالا این استور پروسجر را چطوری باید صدا زد؟ (البته پارامترهای من از نوع رشته ای است)
CREATE TYPE TVP AS TABLE
(
Name varchar(50)
)
CREATE PROCEDURE SP
@T TVP READONLY
AS
BEGIN
SELECT * FROM @T
END
مثلا می خواهم این مقادیر را ارسال کنم:
'Ali','Hasan','masood'
EXEC SP @T=??????
به این صورت
declare @tmp TVP
insert into @tmp values ('Ali'),('Hasan'),('masood')
EXEC SP @T=@tmp