J'ai des problèmes avec cette requête ... Une idée comment déclarer des variables et les rendre visibles à la requête OPENROWSET?
DECLARE @SERVERNM VARCHAR;
SET @SERVERNM = (SELECT(CAST(CONNECTIONPROPERTY('local_net_address') AS VARCHAR) + '\' + CAST(SERVERPROPERTY('InstanceName') AS VARCHAR)))
SELECT
*
FROM
OPENROWSET('SQLOLEDB','SERVER=@SERVERNM;Trusted_Connection=yes;',
'set fmtonly off;exec DW..P750106119 @ENT_NR_VERSAO=1')
Erreur:
Fournisseur de canaux nommés: impossible d'ouvrir une connexion à SQL Server [53].
3 Réponses :
Voici la déclaration des variables:
DECLARE @SERVERNM VARCHAR(100)
SET @SERVERNM = (SELECT(CAST(CONNECTIONPROPERTY('local_net_address') AS VARCHAR)+'\'+CAST(SERVERPROPERTY('InstanceName') AS VARCHAR)))
@ENT_NR_VERSAO est une variable à l'intérieur de Sp P750106119, donc je n'ai pas besoin de la déclarer, il suffit de la définir.
Cela ne résoudra pas le problème de 'SERVER = @ SERVERNM; Trusted_Connection = yes;' . Contrairement à certains langages, T-SQL ne remplace pas en ligne les noms de variables dans une chaîne littérale par la valeur des variables. DECLARE @var varchar (10) = 'abc'; SELECT '123 @ var'; ne retournera pas '123abc' , il renverra '123 @ var' . De plus, vous devriez appliquer la logique de déclaration de votre longueur non seulement à la déclaration de variable, mais également aux types de données dans les expressions CAST .
Vous ne pouvez pas utiliser une variable dans une chaîne littérale. Dans votre connexion, vous indiquez que vous souhaitez vous connecter à un serveur appelé "@SERVERNM" , pas la valeur de @SERVERNM . De plus, comme vous avez DECLARE @SERVERNM VARCHAR , qui est identique à DECLARE @SERVERNM VARCHAR (1) . Je soupçonne que cela pourrait fonctionner mais suppose @SERVERNM aura une valeur inférieure ou égale à 128 caractères:
DECLARE @SERVERNM sysname;
SELECT @SERVERNM = CAST(CONNECTIONPROPERTY('local_net_address') AS sysname)+'\'+CAST(SERVERPROPERTY('InstanceName') AS sysname);
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT *' + NCHAR(13) + NCHAR(10) +
N'FROM OPENROWSET(''SQLOLEDB'',' + NCHAR(13) + NCHAR(10) +
N' ''SERVER=' + QUOTENAME(@SERVERNM,'"') + N';Trusted_Connection=yes;'',' + NCHAR(13) + NCHAR(10) +
N' ''set fmtonly off;exec DW..P750106119 @ENT_NR_VERSAO=1'');'
EXEC sp_executesql @SQL;
J'ai changé un peu votre solution, mais je l'ai! salut mon pote
SOLUTION:
DECLARE @SERVERNM sysname;
SET @SERVERNM = 'SERVER='+CAST(CONNECTIONPROPERTY('local_net_address') AS sysname)+'\'+CAST(SERVERPROPERTY('InstanceName') AS sysname)+';Trusted_Connection=yes;'
DECLARE @TEST NVARCHAR(MAX)
SET @TEST = QUOTENAME(@SERVERNM,'''')
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT *' + NCHAR(13) + NCHAR(10) +
N'FROM OPENROWSET(''SQLOLEDB'',' + NCHAR(13) + NCHAR(10) +
N' ' + @TEST + ',' + NCHAR(13) + NCHAR(10) +
N' ''set fmtonly off;exec DW..P750106119 @ENT_NR_VERSAO=1'');'
EXEC sp_executesql @SQL;
Avez-vous configuré cette connexion sécurisée sur le serveur à partir duquel vous appelez? Et l'utilisateur avec lequel vous exécutez cette requête a-t-il l'autorisation d'accéder aux deux?
Vous déclarez pas mal de varchars ici mais AUCUN d'entre eux n'a la longueur spécifiée. Ne vous fiez pas aux valeurs par défaut, soyez précis. Savez-vous que la longueur par défaut peut changer en fonction de la façon dont vous l'utilisez? sqlblog.org/2009/10/ 09 /…