SQL Server OPENQUERY avec paramètres : solutions de contournement
Le OPENQUERY
de SQL Server exécute des requêtes sur des serveurs liés, mais l'utilisation directe de variables dans ses arguments n'est pas prise en charge. Cela nécessite des solutions de contournement pour le passage des paramètres.
Méthode 1 : transmission de valeurs simples via la concaténation de chaînes
Pour les requêtes simples nécessitant des valeurs spécifiques, le SQL dynamique avec concaténation de chaînes est une solution viable :
<code class="language-sql">DECLARE @TSQL VARCHAR(8000), @VAR CHAR(2); SELECT @VAR = 'CA'; SELECT @TSQL = 'SELECT * FROM OPENQUERY(MyLinkedServer,''SELECT * FROM pubs.dbo.authors WHERE state = ''''' + @VAR + ''''''')'; EXEC (@TSQL);</code>
Méthode 2 : transmettre l'intégralité de la requête sous forme de chaîne
Cette approche permet de transmettre dynamiquement la requête complète ou même le nom du serveur lié :
<code class="language-sql">DECLARE @OPENQUERY NVARCHAR(4000), @TSQL NVARCHAR(4000), @LinkedServer NVARCHAR(4000); SET @LinkedServer = 'MyLinkedServer'; SET @OPENQUERY = 'SELECT * FROM OPENQUERY('+ @LinkedServer + ',''''; SET @TSQL = 'SELECT au_lname, au_id FROM pubs..authors'')'; EXEC (@OPENQUERY + @TSQL);</code>
Méthode 3 : Utilisation de sp_executesql pour une gestion plus propre des paramètres
Pour éviter les citations imbriquées complexes, utilisez sp_executesql
:
<code class="language-sql"> DECLARE @VAR CHAR(2); SELECT @VAR = 'CA'; EXEC MyLinkedServer.master.dbo.sp_executesql N'SELECT * FROM pubs.dbo.authors WHERE state = @state', N'@state CHAR(2)', @VAR; ``` This method offers improved readability and reduces the risk of SQL injection vulnerabilities compared to string concatenation. Note that you're executing `sp_executesql` on the linked server itself. Choose the method that best suits your query complexity and preference for code clarity. Remember to prioritize security and avoid SQL injection vulnerabilities when using dynamic SQL.</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!