PDA

View Full Version : سوال: استفاده از Subquery در دستور Insert Values



hadi000333
چهارشنبه 25 آذر 1388, 13:31 عصر
با سلام خدمت همه دوستان و اساتيد محترم
من يه كوئري نوشتم كه در sql 2008 به خوبي و هيچ مشكلي كار ميكنه و لي در sql 2005 كه در سرور هست اين خطا رو مي ده


Msg 1046, Level 15, State 1, Procedure SP_Commerce_GetCustomerReport, Line 18
Subqueries are not allowed in this context. Only scalar expressions are allowed.
Msg 102, Level 15, State 1, Procedure SP_Commerce_GetCustomerReport, Line 20
Incorrect syntax near ','.
Msg 102, Level 15, State 1, Procedure SP_Commerce_GetCustomerReport, Line 21
Incorrect syntax near ','.
Msg 102, Level 15, State 1, Procedure SP_Commerce_GetCustomerReport, Line 23
Incorrect syntax near ')'.
اسكريپت منم

/****** Object: StoredProcedure [dbo].[SP_Commerce_GetCustomerReport] Script Date: 12/16/2009 02:02:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SP_Commerce_GetCustomerReport]

AS
/* SET NOCOUNT ON */


DECLARE @CustomerTotals TABLE
(
NewCustomersCount int ,
TotalCustomerCount int ,
OnLineCustomersCount int ,
ALLOfCustomerTodayLogin int
)


INSERT INTO @CustomerTotals (NewCustomersCount,TotalCustomerCount,OnLineCustom ersCount,ALLOfCustomerTodayLogin)
VALUES(
(SELECT COUNT(*) FROM Commerce_Customer
Where DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0)= DATEADD(dd, DATEDIFF(dd,0,Commerce_Customer.JoinDate), 0) ),
(SELECT COUNT(*) FROM Commerce_Customer ),
(SELECT COUNT(*) FROM Commerce_Customer WHERE DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0) =DATEADD(dd, DATEDIFF(dd,0,Commerce_Customer.LastActivityDate), 0) ),
(SELECT COUNT(*) FROM Commerce_Customer WHERE DATEADD(dd, DATEDIFF(dd,0,Commerce_Customer.LastLoginDate), 0) = DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0))
)


Select * from @CustomerTotals


RETURN
GO

با تشكر

محمد سلیم آبادی
چهارشنبه 25 آذر 1388, 14:32 عصر
سلام دوست عزیز،
از پیغام خطا پیداست که نمی توانید در دستور Insert Values از Subquery استفاده کنین تنها مقادیر و عبارات scalar مورد قبول است.

شما از دستور Insert Select برای درج سطر مورد نظر استفاده کنین

AminSobati
چهارشنبه 25 آذر 1388, 14:52 عصر
INSERT INTO @CustomerTotals (NewCustomersCount,TotalCustomerCount,OnLineCustom ersCount,ALLOfCustomerTodayLogin)

select

(SELECT COUNT(*) FROM Commerce_Customer

Where DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0)= DATEADD(dd, DATEDIFF(dd,0,Commerce_Customer.JoinDate), 0) ),

(SELECT COUNT(*) FROM Commerce_Customer ),

(SELECT COUNT(*) FROM Commerce_Customer WHERE DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0) =DATEADD(dd, DATEDIFF(dd,0,Commerce_Customer.LastActivityDate), 0) ),

(SELECT COUNT(*) FROM Commerce_Customer WHERE DATEADD(dd, DATEDIFF(dd,0,Commerce_Customer.LastLoginDate), 0) = DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0))

hadi000333
چهارشنبه 25 آذر 1388, 15:49 عصر
متشركم
مشكل من حل شد.
اما مشكل از اينه كه در Sql 2005 اين syntax ساپورت نميشه
با ه روش ديگه هم تونستم كوئري رو اجرا كنم تونم
با declare و Set كردن متغيير ها بود
ولي روش شما بهتر و راحتتر بود

محمد سلیم آبادی
چهارشنبه 25 آذر 1388, 16:26 عصر
متشركم
مشكل من حل شد.
اما مشكل از اينه كه در Sql 2005 اين syntax ساپورت نميشه
با ه روش ديگه هم تونستم كوئري رو اجرا كنم تونم
با declare و Set كردن متغيير ها بود
ولي روش شما بهتر و راحتتر بود

دوست عزیز در واقع یک راه بهتری نیز وجود دارد، از این SP استفاده کنین:


CREATE PROCEDURE [dbo].[SP_Commerce_GetCustomerReport] AS
select COUNT(*) as TotalCustomerCount,
SUM(case when DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0)= DATEADD(dd, DATEDIFF(dd,0,Commerce_Customer.JoinDate), 0) then 1
else 0
end) as NewCustomersCount,
SUM(case when DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0) =DATEADD(dd, DATEDIFF(dd,0,Commerce_Customer.LastActivityDate), 0) then 1
else 0
end) as OnLineCustomersCount,
SUM(case when DATEADD(dd, DATEDIFF(dd,0,Commerce_Customer.LastLoginDate), 0) = DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0) then 1
else 0
end) as ALLOfCustomerTodayLogin
from Commerce_Customer

محمد سلیم آبادی
چهارشنبه 25 آذر 1388, 16:30 عصر
جدا از SP قبلی، شما اصلا نیازی ندارین که یک متغیر جدولی ایجاد کنین و در آن یک سطر درج کرده و در انتها آن را select کنین. یک راه دیگری که وجود دارد این است که با کمک select و subquery این کار را انجام دهین مثلا:
select (select count(*) from table_1) as column1, (select count(*) from table_1 where....) as col2

AminSobati
چهارشنبه 25 آذر 1388, 23:46 عصر
متشركم
مشكل من حل شد.
اما مشكل از اينه كه در Sql 2005 اين syntax ساپورت نميشه
با ه روش ديگه هم تونستم كوئري رو اجرا كنم تونم
با declare و Set كردن متغيير ها بود
ولي روش شما بهتر و راحتتر بود

من اون اسکریپ رو در 2005 تست کردم

hadi000333
پنج شنبه 26 آذر 1388, 11:40 صبح
دوست عزیز در واقع یک راه بهتری نیز وجود دارد، از این SP استفاده کنین
بله خيلي خوب بود وبه خوبي اجرا شد.


جدا از SP قبلی، شما اصلا نیازی ندارین که یک متغیر جدولی ایجاد کنین و در آن یک سطر درج کرده و در انتها آن را select کنین. یک راه دیگری که وجود دارد این است که با کمک select و subquery این کار را انجام دهین مثلا:
select (select count(*) from table_1) as column1, (select count(*) from table_1 where....) as col2
درسته اين همون چيزي هست كه من بهش نياز داشتم
از زماني كه گذاشتيد متشكرم


من اون اسکریپ رو در 2005 تست کردم

اگه منظور شما اسكريپ من هست چون چند جا خوندم فقط در Sql2008
اما اگه منظور اسكريپت خودتون هست بله به درستي كار كرد.
بازهم متشكرم