[SQL] NVARCHAR (최대)의 경우 난 단지 SQL에서 4000 문자는 무엇입니까?
SQLNVARCHAR (최대)의 경우 난 단지 SQL에서 4000 문자는 무엇입니까?
이것은 SS 2005입니다.
왜 난 단지 4000 개 문자가 아닌 8000는 무엇입니까?
그것은 4000에서 SQL1 @ 문자열을 자릅니다.
ALTER PROCEDURE sp_AlloctionReport(
@where NVARCHAR(1000),
@alldate NVARCHAR(200),
@alldateprevweek NVARCHAR(200))
AS
DECLARE @SQL1 NVARCHAR(Max)
SET @SQL1 = 'SELECT DISTINCT VenueInfo.VenueID, VenueInfo.VenueName, VenuePanels.PanelID,
VenueInfo.CompanyName, VenuePanels.ProductCode, VenuePanels.MF, VenueInfo.Address1,
VenueInfo.Address2, '' As AllocationDate, '' As AbbreviationCode, VenueInfo.Suburb, VenueInfo.Route, VenueInfo.ContactFirstName,
VenueInfo.ContactLastName, VenueInfo.SuitableTime, VenueInfo.OldVenueName,
VenueCategories.Category, VenueInfo.Phone, VenuePanels.Location, VenuePanels.Comment,
[VenueCategories].[Category] + '' Allocations'' AS ReportHeader,
ljs.AbbreviationCode AS PrevWeekCampaign
FROM (((VenueInfo INNER JOIN VenuePanels ON VenueInfo.VenueID = VenuePanels.VenueID)
INNER JOIN VenueCategories ON VenueInfo.CategoryID = VenueCategories.CategoryID)
LEFT JOIN (SELECT CampaignProductions.AbbreviationCode, VenuePanels.PanelID, CampaignAllocations.AllocationDate
FROM (((VenueInfo INNER JOIN VenuePanels ON VenueInfo.VenueID=VenuePanels.VenueID) INNER JOIN CampaignAllocations ON VenuePanels.PanelID=CampaignAllocations.PanelID) INNER JOIN CampaignProductions ON CampaignAllocations.CampaignID=CampaignProductions.CampaignID) INNER JOIN VenueCategories ON VenueInfo.CategoryID=VenueCategories.CategoryID
WHERE ' + @alldateprevweek + ') ljs
ON VenuePanels.PanelID = ljs.PanelID)
INNER JOIN (SELECT VenueInfo.VenueID, VenuePanels.PanelID, VenueInfo.VenueName, VenueInfo.CompanyName, VenuePanels.ProductCode,
VenuePanels.MF, VenueInfo.Address1, VenueInfo.Address2, CampaignAllocations.AllocationDate,
CampaignProductions.AbbreviationCode, VenueInfo.Suburb, VenueInfo.Route, VenueInfo.ContactFirstName,
VenueInfo.ContactLastName, VenueInfo.SuitableTime, VenueInfo.OldVenueName, VenueCategories.Category,
VenueInfo.Phone, VenuePanels.Location, VenuePanels.Comment, [Category] + '' Allocations'' AS ReportHeader,
ljs2.AbbreviationCode AS PrevWeekCampaign
FROM ((((VenueInfo INNER JOIN VenuePanels ON VenueInfo.VenueID = VenuePanels.VenueID)
INNER JOIN CampaignAllocations ON VenuePanels.PanelID = CampaignAllocations.PanelID)
INNER JOIN CampaignProductions ON CampaignAllocations.CampaignID = CampaignProductions.CampaignID)
INNER JOIN VenueCategories ON VenueInfo.CategoryID = VenueCategories.CategoryID)
LEFT JOIN (SELECT CampaignProductions.AbbreviationCode, VenuePanels.PanelID, CampaignAllocations.AllocationDate
FROM (((VenueInfo INNER JOIN VenuePanels ON VenueInfo.VenueID=VenuePanels.VenueID) INNER JOIN CampaignAllocations ON VenuePanels.PanelID=CampaignAllocations.PanelID) INNER JOIN CampaignProductions ON CampaignAllocations.CampaignID=CampaignProductions.CampaignID) INNER JOIN VenueCategories ON VenueInfo.CategoryID=VenueCategories.CategoryID
WHERE ' + @alldateprevweek + ') ljs2
ON VenuePanels.PanelID = ljs2.PanelID
WHERE ' + @alldate + ' AND ' + @where + ') ljs3
ON VenueInfo.VenueID = ljs3.VenueID
WHERE (((VenuePanels.PanelID)<>ljs3.[PanelID] And
(VenuePanels.PanelID) Not In (SELECT PanelID FROM CampaignAllocations WHERE ' + @alldateprevweek + '))
AND ' + @where + ')
UNION ALL
SELECT VenueInfo.VenueID, VenueInfo.VenueName, VenuePanels.PanelID, VenueInfo.CompanyName, VenuePanels.ProductCode,
VenuePanels.MF, VenueInfo.Address1, VenueInfo.Address2, CampaignAllocations.AllocationDate,
CampaignProductions.AbbreviationCode, VenueInfo.Suburb, VenueInfo.Route, VenueInfo.ContactFirstName,
VenueInfo.ContactLastName, VenueInfo.SuitableTime, VenueInfo.OldVenueName, VenueCategories.Category,
VenueInfo.Phone, VenuePanels.Location, VenuePanels.Comment, [Category] + '' Allocations'' AS ReportHeader,
ljs.AbbreviationCode AS PrevWeekCampaign
FROM ((((VenueInfo INNER JOIN VenuePanels ON VenueInfo.VenueID = VenuePanels.VenueID)
INNER JOIN CampaignAllocations ON VenuePanels.PanelID = CampaignAllocations.PanelID)
INNER JOIN CampaignProductions ON CampaignAllocations.CampaignID = CampaignProductions.CampaignID)
INNER JOIN VenueCategories ON VenueInfo.CategoryID = VenueCategories.CategoryID)
LEFT JOIN (SELECT CampaignProductions.AbbreviationCode, VenuePanels.PanelID, CampaignAllocations.AllocationDate
FROM (((VenueInfo INNER JOIN VenuePanels ON VenueInfo.VenueID=VenuePanels.VenueID) INNER JOIN CampaignAllocations ON VenuePanels.PanelID=CampaignAllocations.PanelID) INNER JOIN CampaignProductions ON CampaignAllocations.CampaignID=CampaignProductions.CampaignID) INNER JOIN VenueCategories ON VenueInfo.CategoryID=VenueCategories.CategoryID
WHERE ' + @alldateprevweek + ') ljs
ON VenuePanels.PanelID = ljs.PanelID
WHERE ' + @alldate + ' AND ' + @where
Select @SQL1
해결법
-
==============================
1.당신은 2GB의 저장 있도록 2GB의 데이터를 수 NVARCHAR (최대)로이 선언했다.
당신은 2GB의 저장 있도록 2GB의 데이터를 수 NVARCHAR (최대)로이 선언했다.
해프닝은 무엇입니까 :
그래서, 당신은 당신이 오른쪽에 NVARCHAR (최대)가 메이크업 있습니다.
하나 개의 아이디어. 제 2 라인을 병합 상수 = NVARCHAR (최대)와 (최대)은 nvarchar
SET @SQL1 = '' SET @SQL1 = @SQL1 + 'SELECT DISTINCT Venue... ....
그것은 모든 언어에서 일어나는 정수 나누기에 다를 바 없다.
declare @myvar float set @myvar = 1/2 --gives zero because it's integer on the right
연산자 우선 순위 (를 추론 데이터 형식 우선 순위가) 항상 "할당"마지막으로 ... 왜 SQL 서버에서 문자열을 유니 코드해야는 다를 수?
-
==============================
2.업데이트 : GBN의 대답은 바로이며, 내가 잘못했다. MSDN 지적한 바와 같이, NVARCHAR (최대) UCS-2로 저장된 데이터의 2 ^ 31-1 바이트 (2 바이트 문자 당 플러스 BOM 2)까지 지원한다. 귀하의 문제는 문자열 연결이 아닌 데이터 유형 제한 될 것으로 보인다.
업데이트 : GBN의 대답은 바로이며, 내가 잘못했다. MSDN 지적한 바와 같이, NVARCHAR (최대) UCS-2로 저장된 데이터의 2 ^ 31-1 바이트 (2 바이트 문자 당 플러스 BOM 2)까지 지원한다. 귀하의 문제는 문자열 연결이 아닌 데이터 유형 제한 될 것으로 보인다.
즉 당신은 SQL 문자열을 구축하는 데 사용하는 경우 말했다, 왜 VARCHAR를 사용합니까? 당신은 데이터베이스의 기본 문자 집합으로 표현할 수없는 필드 이름이 있습니까 (일반적으로 라틴 1)?
마지막으로 - 당신은 당신의 저장 프로 시저에서 동적 SQL을 사용하지 않음으로써 전체 문제를 단순화 할 수있다. 당신의 절 문자열과 반환 테이블을, 그리고 당신의 절차에서 그들과 합류 일부 테이블 반환 함수를 만듭니다. 적어도 데이터베이스가 준비된 문으로 SP 본체를 캐시 할 수 있기 때문에 보너스로 거의 확실하게, 훨씬 더 빨리 될 것입니다.
-
==============================
3.내가 해결 문제 모든 문자열과 문제가 해결되기 전에 단지 N 문자를 포함 예를 들면
내가 해결 문제 모든 문자열과 문제가 해결되기 전에 단지 N 문자를 포함 예를 들면
declare @sql nvarchar(max) = '' + @Where + 'SomeThing';
해야
declare @sql nvarchar(max) = N'' + @Where + N'SomeThing';
당신이 비워 문자열을 설정 한 경우도 ''N을 설정해야합니다
if @where is null set @where = N''
:-) 간단한 대답
from https://stackoverflow.com/questions/1371383/for-nvarcharmax-i-am-only-getting-4000-characters-in-tsql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 쿼리를 제외하고 사용하는 경우 오류 (0) | 2020.04.05 |
---|---|
[SQL] SUM에 의해 MySQL의 그룹 (0) | 2020.04.05 |
[SQL] MySQL의에 제한을 사용하여 여러 행을 업데이트? (0) | 2020.04.04 |
[SQL] 고유 한 열 (ID 및 쉼표로 구분 된 목록) - 2 열만큼의 관계를 보이기 (0) | 2020.04.04 |
[SQL] 자연 SQL 서버에 참여 (0) | 2020.04.04 |