[SQL Server]Maken van een SQL statement in een SP*

Pagina: 1
Acties:

  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Goede morgen,

Ik heb een Stored Procedure gemaakt, en binnen die SP wordt een SQL-Statement opgebouwd, en in een variabele gegooid.
Niets moeilijks dus.
Maar, wanneer ik deze query wil executen
code:
1
EXEC @Statement

resulteerd dat in de volgende error
code:
1
2
Server: Msg 203, Level 16, State 2, Procedure SP_LoadListDocuments, Line 95
The name 'SELECT Creator.FirstName + ' ' + Creator.Middle...

Nu kan ik daar dus helaas helemaal niets mee :'(

Maar, wanneer ik in de SP het SQL-Statement print ipv execute
code:
1
PRINT @Statement

Het statement dan in de Query Analyzer plak, en dan parse (CTRL+F5), en daarna run (F5), worden gewoon de resultaten terug gegeven.:?

Is er iemand bekend met dit probleem??

P.S
Ik ben al een tijdje (in uren dan) aan het zoeken, en op msdn.microsoft.com, en alle andere standaard "hier zoek ik oplossingen voor errors" sites komt niets terug over deze error melding.

Alvast bedankt.

| Life is a game (and games are fun) | homepage |


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:40
Heb je die Msg 203 al eens opgezocht?

Moet je bij het opbouwen van uw SQL - statement niet
[code]'SELECT Creator.Firstname, ' +
' Creator.LastName, ' + ..
[code]
doen ipv
code:
1
'SELECT Firstname + ' ' + Creator.MIddle

https://fgheysels.github.io/


Verwijderd

Over welke SQL heb je het? Over MySQL, Interbase, PostgreSQL? :?

Weet je zeker dat die Query syntax in SP goed is, gezien het feit dat wanneer je m handmatig parst het wel werkt?

Stukje source-code is wel gewenst :P

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:40
Op dinsdag 25 juni 2002 10:53 schreef ridde100 het volgende:
Over welke SQL heb je het? Over MySQL, Interbase, PostgreSQL? :?
SQL is SQL. Jij verwart SQL met DBMS'en. Ik vermoed dat de topicstarter SQL Server gebruikt.

https://fgheysels.github.io/


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Praten we hier nu over daadwerkelijk dynamische SQL of is je query alleen geparametriseerd in de where-clause.
Want weet je zeker dan je in een SP een query als tekst kan opbouwen en dat kan executeren. Ik ken SQL Server SP's niet, vandaar.
Nogmaals het verzoek om een iets groter stuk van de code hier neer te zetten.

  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Degene die de topictitel heeft aangepast, dank je, dat was ik vergeten.

Hier is het SQL
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
ALTER   Procedure SP_LoadListDocuments
    (@DocumentId VARCHAR(4000), 
    @NodeStrId VARCHAR(50), 
    @LanguageId INT)
As

DECLARE @Statement VARCHAR(8000)

SET @Statement = 'SELECT Creator.FirstName + '' '' + Creator.MiddleName + '' '' + Creator.LastName AS CreatorName, Owner.FirstName + '' '' + Owner.MiddleName + '' '' + Owner.LastName AS OwnerName, '
SET @Statement = @Statement + 'TBL_Teams.Name AS OwnerTeamName, TBL_Documents.CreationDate AS CreationDate, TBL_Documents.ExpiryDate AS ExpiryDate, TBL_Documents.CountViews AS CountViews, '
SET @Statement = @Statement + 'TBL_CategoriesLanguages.Name AS CategoryName,  LV1.Value AS DocTemplateName, TBL_PropertyValues.PropertyId AS PropertyId, TBL_Properties.PropertyTypeId AS PropertyTypeId, '
SET @Statement = @Statement + 'TBL_PropertyValues.Value AS Value, TBL_DocTemplateProperties.SortOrder, TBL_DocTemplateProperties.IsRequired AS IsRequired, TBL_Teams.StrId AS TeamStrId, TBL_Categories.Id AS CategoryId, '
SET @Statement = @Statement + 'TBL_Documents.LockedByUserId AS LockedByUserId, TBL_Documents.LockTime AS LockTime, Owner.EMail as OwnerMail, Creator.EMail AS CreatorMail, '
SET @Statement = @Statement + 'TBL_DocTemplates.MaxNumberOfAttachMents As MaxAttachments, TBL_LanguageValues.Value AS PropertyName, TBL_DocTemplates.Id AS DocTemplateId, TBL_Documents.ToBeApproved, TBL_Documents.Id AS DocumentId '
SET @Statement = @Statement + 'FROM TBL_Documents '
SET @Statement = @Statement + ' INNER JOIN TBL_PropertyValues '
SET @Statement = @Statement + ' ON TBL_PropertyValues.DocumentId = TBL_Documents.Id '
SET @Statement = @Statement + ' INNER JOIN TBL_DocTemplateProperties '
SET @Statement = @Statement + '     INNER JOIN TBL_Properties '
SET @Statement = @Statement + '         INNER JOIN TBL_LanguageValues'
SET @Statement = @Statement + '         ON TBL_LanguageValues.ItemId = TBL_Properties.Id '
SET @Statement = @Statement + '     ON TBL_Properties.Id = TBL_DocTemplateProperties.PropertyId '
SET @Statement = @Statement + ' ON TBL_DocTemplateProperties.DocTemplateId = TBL_Documents.DocTemplateId '
SET @Statement = @Statement + ' INNER JOIN TBL_Users Creator '
SET @Statement = @Statement + ' ON Creator.Id = TBL_Documents.CreatedByUserId '
SET @Statement = @Statement + ' INNER JOIN TBL_Users Owner '
SET @Statement = @Statement + ' ON Owner.Id = TBL_Documents.OwnerUserId'
SET @Statement = @Statement + ' INNER JOIN TBL_Teams '
SET @Statement = @Statement + ' ON TBL_Teams.StrId = TBL_Documents.OwnerTeamId '
SET @Statement = @Statement + ' INNER JOIN TBL_DocTemplates '
SET @Statement = @Statement + '     INNER JOIN TBL_Categories '
SET @Statement = @Statement + '         INNER JOIN TBL_CategoriesLanguages '
SET @Statement = @Statement + '         ON TBL_CategoriesLanguages.CategoryId = TBL_Categories.Id '
SET @Statement = @Statement + '     ON TBL_Categories.Id = TBL_DocTemplates.CategoryId '
SET @Statement = @Statement + '     INNER JOIN TBL_LanguageValues LV1 '
SET @Statement = @Statement + '     ON  LV1.ItemId = TBL_DocTemplates.Id '
SET @Statement = @Statement + ' ON TBL_Documents.DocTemplateId = TBL_DocTemplates.Id '
SET @Statement = @Statement + 'WHERE TBL_Documents.Id IN(' + @DocumentId +  ') '
SET @Statement = @Statement + 'AND TBL_DocTemplateProperties.PropertyId = TBL_PropertyValues.PropertyId '
SET @Statement = @Statement + 'AND TBL_CategoriesLanguages.LanguageId = ' + CONVERT(VARCHAR(50), @LanguageId) + ' '
SET @Statement = @Statement + 'AND TBL_LanguageValues.LanguageId = ' + CONVERT(VARCHAR(50), @LanguageId) + ' '
SET @Statement = @Statement + 'AND TBL_LanguageValues.TableName = ''TBL_Properties'' '
SET @Statement = @Statement + 'AND LV1.TableName = ''TBL_DocTemplates'' '
SET @Statement = @Statement + 'AND LV1.LanguageId = ' + CONVERT(VARCHAR(50), @LanguageId) + ' '
SET @Statement = @Statement + 'GROUP BY TBL_Documents.CreationDate, TBL_Documents.ExpiryDate, Creator.FirstName + '' '' + Creator.MiddleName + '' '' + Creator.LastName, '
SET @Statement = @Statement + 'Owner.FirstName + '' '' + Owner.MiddleName + '' '' + Owner.LastName, TBL_Documents.CountViews, TBL_Teams.Name, TBL_CategoriesLanguages.Name, '
SET @Statement = @Statement + 'TBL_PropertyValues.PropertyId, TBL_Properties.PropertyTypeId, TBL_PropertyValues.Value, TBL_DocTemplateProperties.SortOrder, TBL_DocTemplateProperties.IsRequired, '
SET @Statement = @Statement + 'TBL_Teams.StrId, TBL_Categories.Id, TBL_Documents.LockedByUserId, TBL_Documents.LockTime, Owner.EMail, Creator.EMail,TBL_DocTemplates.MaxNumberOfAttachMents, '
SET @Statement = @Statement + 'TBL_LanguageValues.Value, TBL_DocTemplates.Id, LV1.Value, TBL_Documents.ToBeApproved, TBL_Documents.Id '
SET @Statement = @Statement + 'ORDER BY TBL_Documents.Id, TBL_DocTemplateProperties.SortOrder'
EXEC @Statement

return

Als je dus die laatste EXEC @Statement vervangt door PRINT @Statement, krijg je dus het SQL-Statement naar je scherm geschreven.

Een mogelijke aanroep is:
SP_LoadListDocuments '1030, 1137, 1189', '', 1
SP_LoadListDocuments '1030', 'BAC', 1

Nog even een uitleg van de 3 variabelen die meegegeven kunnen worden

@DocumentId kan zijn: '1,2,3,100, 98, 7' of '10'. Oftewel, een serie van 1 of meer gehele getallen, gescheiden door een komma

@NodeStrId kan elke combinatie van letters zijn. A..Z

@LanguageId is een integer.

Verder werk ik met Windows XP en MS.SQL-Server 2000

| Life is a game (and games are fun) | homepage |


  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 03-09 15:18

Crazy D

I think we should take a look.

Met sp_executesql kun je je string met de query uitvoeren.

Exact expert nodig?


Verwijderd

Op dinsdag 25 juni 2002 10:41 schreef akakiwi het volgende:
Ik heb een Stored Procedure gemaakt, en binnen die SP wordt een SQL-Statement opgebouwd, en in een variabele gegooid.
Niets moeilijks dus.
Maar, wanneer ik deze query wil executen
code:
1
EXEC @Statement

resulteerd dat in de volgende error
code:
1
2
Server: Msg 203, Level 16, State 2, Procedure SP_LoadListDocuments, Line 95
The name 'SELECT Creator.FirstName + ' ' + Creator.Middle...

Nu kan ik daar dus helaas helemaal niets mee :'(
ZOals hierboven gezegd: via EXEC sp_executesql

Maar het bouwen van queries in een stored procedure lost niets op: elke keer dat je de querie uitvoert moet SQLServer de query recompilen. M.a.w.: je hebt er geen voordeel van. Beter is wellicht een view te maken en daar een select uit te doen, of de query in de data-access layer te formuleren met parameters zodat sqlserver de query gecompileerd in cache houdt.
Pagina: 1