2017-02-19 1 views
1

J'essaie de faire une instruction select et d'utiliser l'une des variables renvoyées pour une autre instruction select qui sera renvoyée.Renvoi des variables de la recherche à utiliser dans l'instruction select

Les recherches de requête en fonction de la field_id = 413.

enter image description here

j'ai besoin 6 retourné afin qu'il puisse être utilisé dans une requête pour obtenir tous les 6 des lignes qui ont cette item_id.

Voici ce que j'ai:

DECLARE @Results TABLE(result sysname); 
INSERT @Results(result); 
DECLARE @SQL4 NVARCHAR(MAX) = 'Select DISTINCT ITEM_ID, ATRR_VAL from [dbo].[CONTRACT_ATTR] WHERE [ATTR_VAL] LIKE ''%@VALUE%'' AND FIELD_ID = 413 ORDER BY [ATTR_VAL]'; 
SET @SQL4 = replace(@SQL4, '@VALUE', '123456'); 
EXEC SP_executesql @SQL4; 
SELECT * FR0M @Results 

Je reçois plusieurs erreurs même si cela tente de suivre un tutoriel en ligne. Qu'est-ce que je fais mal et comment puis-je le réparer?

EDIT: Je me rapproche:

declare @myTable table 
(
    ITEM_ID nvarchar(256), 
    ATTR_VAL nvarchar(256) 
) 

insert into @myTable 
    exec (N'Select ITEM_ID, ATTR_VAL from [dbo].[CONTRACT_ATTR] WHERE [ATTR_VAL] LIKE ''%123%'' AND FIELD_ID = 413 ORDER BY [ATTR_VAL]') --dynamic query 

select * from @myTable 
+0

La déclaration 'de INSERT' est incomplète. Quelles données essayez-vous d'insérer dans la variable de table? –

+0

@GiorgosBetsos J'essaie d'insérer (ITEM_ID, ATRR_VAL). –

+0

Vous ne pouvez pas faire cela. La table '@ Results' n'a qu'une seule colonne. Et BTW pourquoi utiliser 'sysname' au lieu de' nvarchar'? –

Répondre

3

Essayez-vous de faire quelque chose comme ça?

Sélectionner toutes les lignes pour une item qui a un attr_val comme @value pour field_id 413:

select ca.* 
    from dbo.contract_attr as ca 
    where exists (
    select 1 
    from dbo.contract_attr as i 
    where i.field_id = 413 
     and i.attr_val like '%'[email protected]+'%' 
     and i.item_id = ca.item_id 
    ) 

Juste au cas où vous n'êtes pas au courant:

critères de recherche avec un caractère générique menant causeront un balayage d'index au lieu d'une recherche d'index (qui est presque toujours plus lent, à moins qu'ils ne fassent un travail équivalent). C'est ce qu'on appelle un non-SARGable. SARGable est l'abréviation de Search ARGument Able.

Si vous pouvez utiliser like @value+'%', il devient SARGable et peut tirer parti d'un index existant sur cette colonne pour effectuer une recherche d'index.

1

Il y a plusieurs problèmes avec le code affiché:

déclaration
  • INSERT devrait être inclus dans la partie sql dynamique.
  • Vous ne pouvez pas utiliser une variable de table dans le cadre d'une instruction SQL dynamique.
  • @Results La table n'est pas assez grande pour contenir les données que vous essayez d'insérer.

Vous pouvez utiliser une table temporaire à la place. Essayez le morceau de code suivant:

CREATE TABLE #Results TABLE(ID int, result nvarchar(128) NOT NULL); 

DECLARE @SQL4 NVARCHAR(MAX) = 'INSERT INTO #Results(ID, result) 
           Select DISTINCT ITEM_ID, ATRR_VAL 
           from [dbo].[CONTRACT_ATTR] 
           WHERE [ATTR_VAL] LIKE ''%@VALUE%'' AND 
            FIELD_ID = 413'; 
SET @SQL4 = replace(@SQL4, '@VALUE', '123456'); 
EXEC SP_executesql @SQL4; 
SELECT * FR0M #Results ORDER BY [result];