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?
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.
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
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