Avatar billede simsen Mester
03. april 2011 - 12:29 Der 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.

Håber en af jer kan hjælpe mig :-)

mvh
simsen :-)
Avatar billede ulrikm Nybegynder
03. april 2011 - 20:50 #1
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.
Avatar billede simsen Mester
03. april 2011 - 22:29 #2
Det hjalp ikke at caste.

Aner ikke hvad du mener med print - men højre klikker på stored proceduren og vælger "Execute Stored Procedure"

Det hjalp heller ikke at ændre Mx no char displayed....

Men du har alligevel hjulpet mig med den cast - for det gjorde, jeg fandt en løsning på Google. Så smid et svar og pointsene er dine :-)

Jeg har slet og ret delt den her laaaaaange sætning op i tre SQL statements og executer dem så efter hinanden.

EXEC (@SQL1 + @SQL2 + @SQL3)
Avatar billede ulrikm Nybegynder
04. april 2011 - 10:28 #3
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!
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester