2010-01-22 5 views
4

C++ Builder ADOQuery SQLServerSQL [Conversion bool]

J'utilise une procédure stockée avec cette sélection

SELECT Name, 
     COALESCE(
     (
     SELECT TOP 1 0 
     FROM TbUserParam 
     WHERE TbUserParam.ID_User = @ID_User 
       AND TbUserParam.ID_Param = CfgListParIzm.ID_ListParIzm 
     ), 1) Visi 
FROM CfgListParIzm 
WHERE CfgListParIzm.ID_ListGroupParIzm = @ID_ListGroupParIzm 

Stuff about this query

dans ma requête avec chaîne SQL:

FlowClientHardQ :ID_User, :ID_ListGroupParIzm 

puis DataSource et DBG débarrasser des champs CheckBox. Source

J'ai donc besoin d'un champ booléen (ou binaire) à partir de ma requête ADO. Comment/Où puis-je le convertir?

Merci.

Répondre

10

Lancez vers le bit?

SELECT Name, 
     CAST(
     COALESCE(
     (
     SELECT TOP 1 0 
     FROM TbUserParam 
     WHERE TbUserParam.ID_User = @ID_User 
       AND TbUserParam.ID_Param = CfgListParIzm.ID_ListParIzm 
     ), 1) as bit) Visi 
FROM CfgListParIzm 
WHERE CfgListParIzm.ID_ListGroupParIzm = @ID_ListGroupParIzm 

Mais pouvez-vous pas réécrire ainsi la requête pour éviter la sous-requête:

SELECT 
    C.Name, 
    CAST(CASE WHEN T2.ID_Param IS NULL THEN 0 ELSE 1 END as bit) AS Visi 
FROM 
    CfgListParIzm C 
    LEFT JOIN 
    (
    SELECT 
     T.ID_Param 
    FROM 
     TbUserParam T 
    WHERE 
     T.ID_User = @ID_User 
    ) T2 On T2.ID_Param = C.ID_ListParIzm 
WHERE 
    C.ID_ListGroupParIzm = @ID_ListGroupParIzm 
+0

oui cela fonctionne, merci, mais j'ai encore quelques problèmes étranges quelque part "ne peut pas trouver le champ Visi" (seulement sur le programme de course) ... merci également pour éviter la sous-requête! – Cynede

3

Peut-être un CAST pour BIT?

SELECT CAST(COALESCE(NULL,1) AS BIT) 

MISE À JOUR Vous pouvez utiliser est ISNULL() aussi bien.