PDA

View Full Version : تعریف متغیر از نوع nvarchar اما با طول بیشتر از 4000



rahjoya
شنبه 13 خرداد 1385, 13:14 عصر
چگونه میتوانم متغیری مانند nvarchr داشته باشم اما تعداد کرکترهایی که قبول میکند بیش از 4000 کرکتر باشد؟

Kamyar.Kimiyabeigi
شنبه 13 خرداد 1385, 13:43 عصر
شما میتونین از text, ntext استفاده کنین ولی دچار محدودیتهایی میشین
مثال در این نوع از فیلدها group by, order by, distinct نمیتونین بزنین

AminSobati
شنبه 13 خرداد 1385, 14:07 عصر
البته معمولا وقتی متن شما حجیم هستش، احتمالا هدف شما طوریه که نیازی به Order By یا ... ندارید.
مثلا قصد نداریم داستانهایی که در فیلد ntext ذخیره کردیم رو بر اساس متن داخلش Sort کنیم!

Omid Rekabsaz
دوشنبه 15 خرداد 1385, 13:58 عصر
اگر الزام به داشتن nvarchar ندارید می توانید از varchar استفاده کنید و به این وسیله 8000 کاراکتر در اختیار دارید....

rahjoya
سه شنبه 16 خرداد 1385, 08:20 صبح
با ntext هم امتحان کردم اما خطا میدهد.

Server: Msg 2739, Level 16, State 1, Line 3
The text, ntext, and image data types are invalid for local variables.

Kamyar.Kimiyabeigi
سه شنبه 16 خرداد 1385, 11:42 صبح
با ntext هم امتحان کردم اما خطا میدهد.

Server: Msg 2739, Level 16, State 1, Line 3
The text, ntext, and image data types are invalid for local variables.
شما نمیتونین متغییری داخلی از نوع ntext داشته باشید

rahjoya
یک شنبه 21 خرداد 1385, 09:01 صبح
شما نمیتونین متغییری داخلی از نوع ntext داشته باشید

میشه منو راهنمایی کنید که چی کار باید بکنم؟

Kamyar.Kimiyabeigi
یک شنبه 21 خرداد 1385, 09:40 صبح
میشه دقیقا" بگین چه کاری میخواین انجام بدین (همراه با Script) تا بتونم کمکتون کنم. منم یک بار مشکل شما رو داشتم که با Temp Table حلش کردم

rahjoya
دوشنبه 22 خرداد 1385, 09:13 صبح
Declare @Name SysName,
@Count BigInt,
@Cmd nVarchar(4000)

Declare C Cursor
For Select C1

From T2
Order By 1 Asc

Open C

Fetch Next From C Into @Name

Select @Count = 0

While @@Fetch_Status <> -1
Begin

Select @Cmd = IsNull(@Cmd , '' ) + ' Union Select Count(*) As C1 From [' + @Name + ']'
Fetch Next From C Into @Name

End
Close C

Deallocate C


Select @Cmd = SubString(@Cmd , 7 , Len(@Cmd) - 6)

Select @Cmd = 'Select Sum(C1) From (' + @Cmd + ') As Result'


Execute (@Cmd)



قبل از هر چیز ببخشید که آخرین کرکتر هر خط افتاده اول خط.

یک بانک اطلاعاتی است با حدود 2000 جدول. که تمامی رکوردهای این جداول در یک جدول ریخته میشود. حالا میخوام کنترل کنم که آیا تعداد رکوردهای این 2000 جدول با تعداد رکوردهای جمع آوری شده در جدول جدید برابرند یا خیر؟
در جدول T2نام تمام جداول بانک اطلاعاتی در فیلد C1 وارد شده است. و در AllT رکوردها جمع آوری میشوند. اما طول متغیر cmd@ برای این کار کافی نیست.
شما از جدول temp صحبت کرده بودین چگونه میتوانم این کار را انجام دهم؟

Kamyar.Kimiyabeigi
دوشنبه 22 خرداد 1385, 10:01 صبح
CREATE TABLE #TempTableCount
(FiledCount INT)
GO

DECLARE @TblName NVARCHAR(4000)
DECLARE CursorPoint CURSOR FOR
SELECT TableName FROM T2
ORDER BY TableName ASC

OPEN CursorPoint

FETCH NEXT FROM CursorPoint
INTO @TblName

WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE('INSERT INTO #TempTableCount
SELECT COUNT(*) FROM ' + @TblName)

FETCH NEXT FROM CursorPoint
INTO @TblName
END

CLOSE CursorPoint
DEALLOCATE CursorPoint
GO

SELECT SUM(FiledCount) AS 'TotalCount' FROM #TempTableCount


DROP TABLE #TempTableCount
GO

من با این کد Count هر جدول رو Insert میکنم تو TempTable و در نهایت Sum رو از TempTable میگیرم