03. april 2011 - 12:29Der er
2 kommentarer og 1 løsning
Dynamisk sql plads problem
Hej,
Jeg er igang med at teste en dynamisk sql stored procedure, som jeg er nødt til at bruge lige i det her tilfælde.
Men jeg er rendt ind i en størrelse problem - når jeg sætter @SQL til nvarchar(MAX) så giver den mig 5000 tegn....Jeg har brug for langt langt mere....Hvilken skal jeg bruge istedet?
Min stored producre til nu;
ALTER PROCEDURE [dbo].[XXTestReportManagementXX] @whereClause AS NVARCHAR(MAX), @orderbyClause AS NVARCHAR(250) = null
AS BEGIN DECLARE @SQL NVARCHAR(MAX)
SET @SQL = ' SELECT dbo.AnsiBug_Bug.bugId, dbo.AnsiBug_Bug.bugName, dbo.AnsiBug_Bug.bugReportedByUserId, AnsiBug_UserProfile_1.firstName + '' '' + AnsiBug_UserProfile_1.LastName AS fullName, dbo.AnsiBug_Bug.bugReportedDate, dbo.AnsiBug_Bug.bugDescription, dbo.AnsiBug_Bug.bugReproduceTrue, dbo.AnsiBug_Bug.bugReproduceDescription, dbo.AnsiBug_Bug.projectId, AnsiBug_Project_1.projectName, dbo.AnsiBug_Bug.projectVersionId, AnsiBug_ProjectVersion_1.projectVersionName, dbo.AnsiBug_Bug.categoryId, dbo.AnsiBug_Category.categoryName, dbo.AnsiBug_Bug.statusId, dbo.AnsiBug_Status.statusName, dbo.AnsiBug_Bug.priorityId, dbo.AnsiBug_Priority.priorityName, dbo.AnsiBug_Bug.severityId, dbo.AnsiBug_Severity.severityName, dbo.AnsiBug_Bug.environmentId FROM dbo.AnsiBug_Bug INNER JOIN dbo.AnsiBug_BugSolution ON dbo.AnsiBug_Bug.bugId = dbo.AnsiBug_BugSolution.bugId INNER JOIN dbo.AnsiBug_BugTest ON dbo.AnsiBug_Bug.bugId = dbo.AnsiBug_BugTest.bugId LEFT OUTER JOIN dbo.AnsiBug_UserProfile ON dbo.AnsiBug_BugTest.approvedByUserId = dbo.AnsiBug_UserProfile.UserId LEFT OUTER JOIN dbo.AnsiBug_ProjectVersion ON dbo.AnsiBug_BugTest.testProjectVersionId = dbo.AnsiBug_ProjectVersion.projectVersionId LEFT OUTER JOIN dbo.AnsiBug_UserProfile AS AnsiBug_UserProfile_5 ON dbo.AnsiBug_BugTest.testByUserId = AnsiBug_UserProfile_5.UserId LEFT OUTER JOIN dbo.AnsiBug_ProjectVersion AS AnsiBug_ProjectVersion_4 ON dbo.AnsiBug_BugTest.targetProjectVersionId = AnsiBug_ProjectVersion_4.projectVersionId LEFT OUTER JOIN dbo.AnsiBug_ProjectVersion AS AnsiBug_ProjectVersion_3 ON dbo.AnsiBug_BugSolution.fixProjectVersionId = AnsiBug_ProjectVersion_3.projectVersionId LEFT OUTER JOIN dbo.AnsiBug_UserProfile AS AnsiBug_UserProfile_4 ON dbo.AnsiBug_BugSolution.fixByUserId = AnsiBug_UserProfile_4.UserId LEFT OUTER JOIN dbo.AnsiBug_ProjectVersion AS AnsiBug_ProjectVersion_2 ON dbo.AnsiBug_BugSolution.targetProjectVersionId = AnsiBug_ProjectVersion_2.projectVersionId LEFT OUTER JOIN dbo.AnsiBug_UserProfile AS AnsiBug_UserProfile_3 ON dbo.AnsiBug_Bug.assignedByUserId = AnsiBug_UserProfile_3.UserId LEFT OUTER JOIN dbo.AnsiBug_UserProfile AS AnsiBug_UserProfile_2 ON dbo.AnsiBug_Bug.assignedToUserId = AnsiBug_UserProfile_2.UserId LEFT OUTER JOIN dbo.AnsiBug_Component ON dbo.AnsiBug_Bug.componentId = dbo.AnsiBug_Component.componentId LEFT OUTER JOIN dbo.AnsiBug_Environment ON dbo.AnsiBug_Bug.environmentId = dbo.AnsiBug_Environment.environmentId LEFT OUTER JOIN dbo.AnsiBug_Platform ON dbo.AnsiBug_Bug.platformId = dbo.AnsiBug_Platform.platformId LEFT OUTER JOIN dbo.AnsiBug_Severity ON dbo.AnsiBug_Bug.severityId = dbo.AnsiBug_Severity.severityId LEFT OUTER JOIN dbo.AnsiBug_Priority ON dbo.AnsiBug_Bug.priorityId = dbo.AnsiBug_Priority.priorityId LEFT OUTER JOIN dbo.AnsiBug_Status ON dbo.AnsiBug_Bug.statusId = dbo.AnsiBug_Status.statusId LEFT OUTER JOIN dbo.AnsiBug_Category ON dbo.AnsiBug_Bug.categoryId = dbo.AnsiBug_Category.categoriId LEFT OUTER JOIN dbo.AnsiBug_Project AS AnsiBug_Project_1 ON dbo.AnsiBug_Bug.projectId = AnsiBug_Project_1.projectId LEFT OUTER JOIN dbo.AnsiBug_UserProfile AS AnsiBug_UserProfile_1 ON dbo.AnsiBug_Bug.bugReportedByUserId = AnsiBug_UserProfile_1.UserId LEFT OUTER JOIN dbo.AnsiBug_ProjectVersion AS AnsiBug_ProjectVersion_1 ON dbo.AnsiBug_Bug.projectVersionId = AnsiBug_ProjectVersion_1.projectVersionId WHERE' + @whereClause EXEC (@SQL) END
Hvis jeg fjerner , dbo.AnsiBug_Bug.environmentId fra min SELECT statement kører den godt igennem (med min where clause som er ret simpel lige nu: projectId = 5 (men den bliver altså også mega lang)) - og ja, jeg er sikker på at environmentId er i tabellen. Det har noget at gøre med min
DECLARE @SQL NVARCHAR(MAX)
Men aner ikke hvordan jeg kommer udenom begrænsningen.
Har du forsøgt at caste din megaselect til nvarchar(max)?
SET @SQL = cast(' SELECT dbo.AnsiBug_Bug.bugId, dbo.AnsiBug_Bug.bugName, dbo.AnsiBug_Bug.bugReportedByUserId, AnsiBug_UserProfile_1.firstName + '' '' + AnsiBug_UserProfile_1.LastName AS fullName, dbo.AnsiBug_Bug.bugReportedDate, dbo.AnsiBug_Bug.bugDescription, dbo.AnsiBug_Bug.bugReproduceTrue, dbo.AnsiBug_Bug.bugReproduceDescription, dbo.AnsiBug_Bug.projectId, AnsiBug_Project_1.projectName, dbo.AnsiBug_Bug.projectVersionId, AnsiBug_ProjectVersion_1.projectVersionName, dbo.AnsiBug_Bug.categoryId, dbo.AnsiBug_Category.categoryName, dbo.AnsiBug_Bug.statusId, dbo.AnsiBug_Status.statusName, dbo.AnsiBug_Bug.priorityId, dbo.AnsiBug_Priority.priorityName, dbo.AnsiBug_Bug.severityId, dbo.AnsiBug_Severity.severityName, dbo.AnsiBug_Bug.environmentId FROM dbo.AnsiBug_Bug INNER JOIN dbo.AnsiBug_BugSolution ON dbo.AnsiBug_Bug.bugId = dbo.AnsiBug_BugSolution.bugId INNER JOIN dbo.AnsiBug_BugTest ON dbo.AnsiBug_Bug.bugId = dbo.AnsiBug_BugTest.bugId LEFT OUTER JOIN dbo.AnsiBug_UserProfile ON dbo.AnsiBug_BugTest.approvedByUserId = dbo.AnsiBug_UserProfile.UserId LEFT OUTER JOIN dbo.AnsiBug_ProjectVersion ON dbo.AnsiBug_BugTest.testProjectVersionId = dbo.AnsiBug_ProjectVersion.projectVersionId LEFT OUTER JOIN dbo.AnsiBug_UserProfile AS AnsiBug_UserProfile_5 ON dbo.AnsiBug_BugTest.testByUserId = AnsiBug_UserProfile_5.UserId LEFT OUTER JOIN dbo.AnsiBug_ProjectVersion AS AnsiBug_ProjectVersion_4 ON dbo.AnsiBug_BugTest.targetProjectVersionId = AnsiBug_ProjectVersion_4.projectVersionId LEFT OUTER JOIN dbo.AnsiBug_ProjectVersion AS AnsiBug_ProjectVersion_3 ON dbo.AnsiBug_BugSolution.fixProjectVersionId = AnsiBug_ProjectVersion_3.projectVersionId LEFT OUTER JOIN dbo.AnsiBug_UserProfile AS AnsiBug_UserProfile_4 ON dbo.AnsiBug_BugSolution.fixByUserId = AnsiBug_UserProfile_4.UserId LEFT OUTER JOIN dbo.AnsiBug_ProjectVersion AS AnsiBug_ProjectVersion_2 ON dbo.AnsiBug_BugSolution.targetProjectVersionId = AnsiBug_ProjectVersion_2.projectVersionId LEFT OUTER JOIN dbo.AnsiBug_UserProfile AS AnsiBug_UserProfile_3 ON dbo.AnsiBug_Bug.assignedByUserId = AnsiBug_UserProfile_3.UserId LEFT OUTER JOIN dbo.AnsiBug_UserProfile AS AnsiBug_UserProfile_2 ON dbo.AnsiBug_Bug.assignedToUserId = AnsiBug_UserProfile_2.UserId LEFT OUTER JOIN dbo.AnsiBug_Component ON dbo.AnsiBug_Bug.componentId = dbo.AnsiBug_Component.componentId LEFT OUTER JOIN dbo.AnsiBug_Environment ON dbo.AnsiBug_Bug.environmentId = dbo.AnsiBug_Environment.environmentId LEFT OUTER JOIN dbo.AnsiBug_Platform ON dbo.AnsiBug_Bug.platformId = dbo.AnsiBug_Platform.platformId LEFT OUTER JOIN dbo.AnsiBug_Severity ON dbo.AnsiBug_Bug.severityId = dbo.AnsiBug_Severity.severityId LEFT OUTER JOIN dbo.AnsiBug_Priority ON dbo.AnsiBug_Bug.priorityId = dbo.AnsiBug_Priority.priorityId LEFT OUTER JOIN dbo.AnsiBug_Status ON dbo.AnsiBug_Bug.statusId = dbo.AnsiBug_Status.statusId LEFT OUTER JOIN dbo.AnsiBug_Category ON dbo.AnsiBug_Bug.categoryId = dbo.AnsiBug_Category.categoriId LEFT OUTER JOIN dbo.AnsiBug_Project AS AnsiBug_Project_1 ON dbo.AnsiBug_Bug.projectId = AnsiBug_Project_1.projectId LEFT OUTER JOIN dbo.AnsiBug_UserProfile AS AnsiBug_UserProfile_1 ON dbo.AnsiBug_Bug.bugReportedByUserId = AnsiBug_UserProfile_1.UserId LEFT OUTER JOIN dbo.AnsiBug_ProjectVersion AS AnsiBug_ProjectVersion_1 ON dbo.AnsiBug_Bug.projectVersionId = AnsiBug_ProjectVersion_1.projectVersionId WHERE' as nvarchar(max))
NB! hvis du bruger "print" til at checke kommandoen, printes kun de første 4000 tegn - brug i stedet "select" - husk at sættte værdien for "Maximum number of characters displayed in each column" under "Query Options"->"Text" til en stor værdi.
Interessant - løsningen med at splitte strengen op skulle, ifølge min forståelse, kun være nødvendig på sql server 2000, hvor man netop ikke har varchar(max) datatypen.. Anyways, godt at du fik det til at virke!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.