PDA

View Full Version : ارسال یک آرایه به داخل store procedure



i-nostalgic
دوشنبه 16 تیر 1393, 21:40 عصر
چگونه می توان یک آرایه را به داخل یک store procedure فرستاد و اینکه پارامتر آرایه در داخل store procedure چطور باید تعریف شود و چگونه می توان از آن استفاده کرد؟

m_soheyl_s
جمعه 21 آذر 1393, 19:10 عصر
این سوال من هم هست.
به جوابهایی هم رسیدم اما گیج شدم.
من می خوام یک آرایه شامل آی دی های یک جدول رو با استور پروسیجر به اسکیوال بفرستم و در اونجا با پیمایش این آرایه به ازای هر عنصر اینزرت انجام بدم.
ممنون میشم شسته و رفته و کامل یکی جواب بده.
از XML هم نمی خوام استفاده کن

espootin
جمعه 21 آذر 1393, 22:31 عصر
با سلام

شما برای اینکار باید ابتدا یک 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 می توانید تعریف کنید.

با استفاده از این پارامتر داده ها را به صورت آرایه یا جدول می توانید به پروسیجر بفرستید.

موفق باشید./

m_soheyl_s
یک شنبه 23 آذر 1393, 20:09 عصر
سوالی که داشتم اینه که اگه قرار باشه با استفاده از این روش علاوه بر یک دیتاتیبل یک ستونه، چند متغیر دیگه که می خوام برای تمامی دیتاتیبل تکرار بشه همزمان اینزرت بشه باید چه کرد.
می دونم می توان در همان سمت سی شارپ به دیتاتیبل اضافه کرد. اما می خوام سمت 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)

منظورم این است که دیتایتبل فرستاده شده یک فیلد باشد.

espootin
دوشنبه 24 آذر 1393, 18:44 عصر
اگر منظورتون رو درست متوجه شده باشم، برای کاهش حجم user defined table type می خواهید ستون های تکراری رو به صورت پارامتر بفرستید، قطعا این کار صحیح تر خواهد بود.

و البته درج به صورت زیر خواهد شد.


INSERT INTO Users(UserID, Tex,DatTime)
SELECT UserID, @text,@Datetime FROM @MyTable

masoode
دوشنبه 23 اردیبهشت 1398, 09:43 صبح
حالا این استور پروسجر را چطوری باید صدا زد؟ (البته پارامترهای من از نوع رشته ای است)
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=??????

hamid_hr
سه شنبه 31 اردیبهشت 1398, 15:19 عصر
به این صورت


declare @tmp TVP
insert into @tmp values ('Ali'),('Hasan'),('masood')
EXEC SP @T=@tmp