2011-12-10 17 views
6

Ho un campo di database nome chiamata Code e sto cercando di selezionarlo utilizzando un nome di variabile come questo qui sotto:dinamicamente scegliere colonna nella query SQL

Declare @var1 = [Code] 

(SELECT @var1 
FROM [VoucherType] 
WHERE [DeletedBy] IS NULL 
AND [AutoID] = 1) 

A quanto pare, SQL interpreterà @var1 come una stringa e non il campo del mio database, come posso farlo in modo tale @var1 è riconosciuto come il nome del campo [Code] invece di una stringa possibilmente senza alcuna istruzione select o if.

risposta

9

Prova questa:

DECLARE @var1 VARCHAR(20) 
DECLARE @sql VARCHAR(255) 

SET @var1 = 'Code' 
SET @sql = 'select ' + @var1 + ' from [VoucherType] where [DeletedBy] is null and [AutoID] = 1' 

EXEC sp_executesql @sql 

Dovrai comporre una query dinamica ed eseguirla utilizzando sp_executesql

Per aggiungere ulteriori informazioni sul lato "dinamico" delle cose, utilizzare le stored procedure. Vedi qui per un esempio:

http://www.marten-online.com/database/execute-dynamic-sql-in-mssql.html

Cioè ... se si utilizza Microsoft SQL Server

+0

+1 per sp_executesql e una buona risposta. –

+0

'+ @ var1 +' dovrebbe essere '+ QUOTENAME (@ var1) +' per evitare problemi con spazi e altri possibili caratteri speciali nei nomi delle colonne. Inoltre, aiuta a prevenire possibili problemi di iniezione. Inoltre, se stai componendo un elenco separato da virgole, ogni singolo nome di colonna deve essere passato attraverso QUOTENAME. – JamieSee

2

Non è possibile utilizzare una variabile come quella in un'istruzione SELECT.

Sarà necessario creare TSQL dinamico.

Non si specifica RDBMS, ma in SQL Server si usa sp_executesql (preferibilmente) o EXEC

Declare @var1 varchar(100) 
Declare @sql varchar(1000) 

SET @var1 = '[Code]' 
SET @sql = ' select ' + @var1 + ' from [VoucherType]' + 
      ' where [DeletedBy] is null and [AutoID] = 1' 

EXEC sp_executesql @sql 

Leggere attentamente: The Curse and Blessings of Dynamic SQL

2

è necessario utilizzare SQL dinamico.

declare @ColName varchar(128) 

declare @sql varchar(4000) 

Set @ColName='Code'; 

select @sql = 'SELECT '[email protected]+' 
    FROM [VoucherType] 
WHERE [DeletedBy] IS NULL 
AND [AutoID] = 1' 
    exec sp_executesql @sql 
go 

Questo post potrebbe essere utile

Accessing a table from a name in a variable

SQL: Select dynamic column name based on variable

saluti

+1

'EXEC' deve essere evitato in favore di' sp_executesql' perché è più efficiente: [riferimento] (http://msdn.microsoft.com/en-us/library/ms175170.aspx) –

0

Si prega di provare con il codice qui sotto:

DECLARE @ var1 VARCHAR (50)

SET @var1 = '[Code]' 

EXEC ('SELECT ' + @var1 + ' FROM [VoucherType] 
     WHERE [DeletedBy] IS NULL AND [AutoID] = 1 ') 
+2

'EXEC' dovrebbe essere evitato in favore di' sp_executesql' perché è più efficiente: [riferimento] (http://msdn.microsoft.com/en-us/library/ms175170.aspx) –

Problemi correlati