web-dev-qa-db-fra.com

INSERER DANS @TABLE EXEC @query avec SQL Server 2000

Est-il vrai que SQL Server 2000, vous ne pouvez pas insérer dans une variable de table à l'aide de exec?

J'ai essayé ce script et j'ai reçu un message d'erreur EXECUTE cannot be used as a source when inserting into a table variable.

declare @tmp TABLE (code varchar(50), mount money)
DECLARE @q nvarchar(4000)
SET @q = 'SELECT coa_code, amount FROM T_Ledger_detail'

INSERT INTO  @tmp (code, mount)
EXEC sp_executesql (@q)

SELECT * from @tmp

Si cela est vrai, que dois-je faire?

36
XMozart

N.B. - cette question et cette réponse concernent la version 2000 de SQL Server. Dans les versions ultérieures, la restriction sur INSERT INTO @table_variable ... EXEC ... ont été supprimés et ne s'appliquent donc pas aux versions ultérieures.


Vous devrez passer à une table temporaire:

CREATE TABLE #tmp (code varchar(50), mount money)
DECLARE @q nvarchar(4000)
SET @q = 'SELECT coa_code, amount FROM T_Ledger_detail'

INSERT INTO  #tmp (code, mount)
EXEC sp_executesql (@q)

SELECT * from #tmp

De la documentation :

Une variable de table se comporte comme une variable locale. Il a une portée bien définie, qui est la fonction, la procédure stockée ou le lot dans lequel elle est déclarée.

Dans sa portée, une variable de table peut être utilisée comme une table normale. Il peut être appliqué partout où une table ou une expression de table est utilisée dans les instructions SELECT, INSERT, UPDATE et DELETE. Toutefois, table ne peut pas être utilisé dans les instructions suivantes:

INSERT INTO table_variable EXEC stored_procedure

SELECT select_list INTO table_variable statements.

64

La documentation est trompeuse.
Le code suivant est en cours d'exécution en production

DECLARE @table TABLE (UserID varchar(100))
DECLARE @sql varchar(1000)
SET @sql = 'spSelUserIDList'
/* Will also work
   SET @sql = 'SELECT UserID FROM UserTable'
*/

INSERT INTO @table
EXEC(@sql)

SELECT * FROM @table
9
cob666
DECLARE @q nvarchar(4000)
SET @q = 'DECLARE @tmp TABLE (code VARCHAR(50), mount MONEY)
INSERT INTO @tmp
  (
    code,
    mount
  )
SELECT coa_code,
       amount
FROM   T_Ledger_detail

SELECT *
FROM   @tmp'

EXEC sp_executesql @q

Si vous voulez en requête dynamique

6
brykneval