PDA

View Full Version : مشکل در خروجی اجرای یک Sp از طریق OPENROWSET



Touska
شنبه 09 بهمن 1389, 12:37 عصر
من در یک SQl SERVER 2008 یک SP دارم به صورت زیر :

BEGIN
SET NOCOUNT ON

DECLARE @New_Code BIGINT
SET @New_Code = ( SELECT [MMT].[dbo].[Return_Inquiry_NewCode](@Univer_ID,
@Center_Code)
)


-- Do Some Things like insert with @New_Code

SET NOCOUNT OFF

SELECT @New_Code
END


حالا اینو از یک SQL 2000 به این شکل صدا می زنم :

SELECT A.* FROM OPENROWSET('SQLOLEDB','192.168.100.100';'sa';'pass ','SET FMTONLY OFF; EXECUTE [MMT].[dbo].[Register_SP] پارامتر ها ')AS A

حالا همانطور که می بینید ، در انتهای SP یک مقدار Select شده که مقدار 1000 است ، از Max +1 یک جدول

بدست اومده ، حالا مشکل زمانی است وقتی SP روی سرور 2008 اجرا می کنیم مقدار 1000 بر می گرداند

ولی وقتی از طریق OPENROWSET از SQL 2000 اجرا می کنم ، مقدار 1001 را بر میگرداند ، در صورتیکه در

دیتابیس سرور مقدار 1000 هم Insert شده است.

حمیدرضاصادقیان
شنبه 09 بهمن 1389, 19:57 عصر
سلام.
یک سوال.چرا نوع متغیر رو Bigint گرفتید.اگر عددتون کوچک هست از نوع int استفاده کنید.
بعد خروجی تابع از چه نوعی هست؟

Touska
یک شنبه 10 بهمن 1389, 08:25 صبح
با سلام نوع BIGINT به این دلیل که این عدد که ایجاد میشه از مرز INT رد میشه.

خروجی تابع هم از نوع BIGINT هست.

جالبش اینجاست که دوبار اجرا نمیشه ، اگر اینطور بود دستورات Insert دوبار اضافه می کرد ، که اینطور نیست.

حمیدرضاصادقیان
پنج شنبه 14 بهمن 1389, 17:37 عصر
سلام.
اگر براتون مقدوره کد خود Sp رو قرار بدید.چون کار شما مشکل خاصی نداره.در ضمن شما می فرمائید مقدار 1000 در دیتابیس اضافه شده و این sp مقدار max+1 رو برمیگردونه. پس نباید مقدار 1001 رو برگردونه؟
مگر مقدار max شما در دیتابیس 1000 نیست؟

Touska
پنج شنبه 14 بهمن 1389, 18:31 عصر
با سلام این کد SP مربوطه :


CREATE PROCEDURE [dbo].[Register_MMT_Server]
(
@Register_Typ TINYINT , -- 0 -> University 1 -> Center & Hospital
@Univer_ID TINYINT ,
@Center_Code SMALLINT ,
@Name NCHAR(25) ,
@Last_Name NCHAR(45) ,
@Father_Name NCHAR(25) ,
@Sh_Sh NCHAR(12) ,
@Birth_Date NCHAR(4) ,
@Orginal_Name NCHAR(255) ,
@Orginal_Famil NCHAR(255) ,
@Orginal_Father NCHAR(255) ,
@National_Id NCHAR(12) ,
@Date_Post NCHAR(10)
)
AS
BEGIN
DECLARE @New_Code BIGINT
SET @New_Code = ( SELECT [MMT].[dbo].[Return_Inquiry_NewCode](@Univer_ID,
@Center_Code)
)

SET NOCOUNT ON


IF ( @New_Code IS NULL )
OR ( @New_Code <= 0 )
BEGIN
SELECT 0
RETURN 0
END

IF ( @New_Code IS NOT NULL )
AND ( @New_Code > 0 )
BEGIN
IF NOT EXISTS ( SELECT TOP 1
Sicker_Code
FROM dbo.MMT_Person
WHERE Sicker_Code = @New_Code )
BEGIN
INSERT INTO dbo.MMT_Person
( Univer_ID ,
Center_Code ,
Sicker_Code ,
National_Code ,
Name ,
Last_Name ,
Father_Name ,
Sh_Sh ,
Birth_Date ,
Orginal_Name ,
Orginal_Famil ,
Orginal_Father ,
Date_Post
)
VALUES ( @Univer_ID ,
@Center_Code ,
@New_Code ,
@National_Id ,
@Name ,
@Last_Name ,
@Father_Name ,
@Sh_Sh ,
@Birth_Date ,
@Orginal_Name ,
@Orginal_Famil ,
@Orginal_Name ,
@Date_Post
)
DECLARE @IDen BIGINT
Select @IDen = @@IDENTITY

END
ELSE
BEGIN
SELECT 0
RETURN 0
END
END

SET NOCOUNT OFF
Select @New_Code
END


این کد Func مربوط به Max جدول 1000 :




CREATE FUNCTION [dbo].[Return_Inquiry_NewCode]
(
@Univer_Id TINYINT ,
@Center_Code SMALLINT
)
RETURNS BIGINT
AS
BEGIN
DECLARE @NewID BIGINT
DECLARE @Mx BIGINT

SELECT @Mx = MAX(Sicker_Code)
FROM MMT.dbo.MMT_Person
WHERE Univer_ID = @Univer_Id
AND Center_Code = @Center_Code

IF @Mx IS NULL
SET @NewID = 100000
ELSE
SET @NewID = (@Mx + 1)

RETURN @NewID
END

حمیدرضاصادقیان
جمعه 15 بهمن 1389, 23:12 عصر
سلام
پیشنهاد میکنم یک بار توسط Openrowset ابتدا تابع رو صدا بزنید و یک تغییر کوچک در تابع در این قسمت بدهید.


IF @Mx IS NULL
SET @NewID = 100000
ELSE
SET @NewID = (@Mx + 1)


به جای استفاده از دستور set از raiseError استفاده کنید یا print ببینید ایا با مقادیر یکسان در هردو Sql شما نتیجه یکسان میگیرید یاخیر.