Existe-t-il un moyen de définir une table temporaire sans définir son schéma à l'avance?
En fait, utiliser une table VARIABLE, une table en mémoire, est la meilleure façon de procéder. La #table crée une table dans temp db, et la table ## est globale - les deux avec des hits de disque. Considérez le ralentissement/hit rencontré avec le nombre de transactions.
CREATE PROCEDURE [dbo].[GetAccounts]
@AccountID BIGINT,
@Result INT OUT,
@ErrorMessage VARCHAR(255) OUT
AS
BEGIN
SET NOCOUNT ON;
SET @Result = 0
SET @ErrorMessage = ''
DECLARE @tmp_Accounts TABLE (
AccountId BIGINT,
AccountName VARCHAR(50),
...
)
INSERT INTO @tmp_Accounts ([AccountId], [AccountName]...
)
SELECT AccountID, AccountName
FROM Accounts
WHERE ...
IF @@Rowcount = 0
BEGIN
SET @ErrorMessage = 'No accounts found.'
SET @Result = 0
RETURN @Result
END
ELSE
BEGIN
SET @Result = 1
SELECT *
FROM @tmp_Accounts
END
Notez la façon dont vous insérez dans cette table temporaire.
L'inconvénient est que l'écriture peut prendre un peu plus de temps, car vous devez définir votre variable de table.
Je recommanderais également SQL Prompt for Query Analyzer by RedGate.
vous n'avez pas besoin d'OPENQUERY. Mettez simplement "INTO #AnyTableName" entre la liste de sélection et le FROM de n'importe quelle requête ...
SELECT *
INTO #Temp1
FROM table1
WHERE x=y
Oui, vous pouvez le créer avec
SELECT INTO ...
Disons
SELECT * INTO #t
FROM OPENQUERY( 'server',
'exec database.dbo.proc_name value1, value2, ... ' )