首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从SSMS内部使用Invoke-Sqlcmd?

如何从SSMS内部使用Invoke-Sqlcmd?
EN

Stack Overflow用户
提问于 2020-10-06 20:05:27
回答 1查看 333关注 0票数 0

我运行下面的查询(在powershell内部),从不同的服务器运行,一切都很好:

代码语言:javascript
复制
Invoke-Sqlcmd -Query "
SELECT [ServerName]=@@servername,m.Match_id, m.HostfamilyId, hf.NIEFlag, ra.DS2019Sent 
FROM APIA_Repl_pub.dbo.repl_HostFamily hf 
INNER JOIN APIA_Repl_pub.dbo.repl_Match m ON m.HostfamilyId =  hf.HostFamilyID
INNER JOIN APIA_Repl_Pub.dbo.repl_Aupair ra on ra.AuPairID = m.AupairId
WHERE ra.JunoCore_applicationID = 459630
" -ServerInstance "CTSTGDB"

有时,我甚至会在多个服务器上运行相同的查询来比较它们,如下面的结果所示:

我只想在SSMS内部运行相同的查询,但是看看我做了什么,得到了什么:

(我甚至简化了查询,但仍然得到了下面的错误)

代码语言:javascript
复制
 GO
 declare @sql varchar(8000)
  SET @SQL=N'powershell.exe -command Invoke-Sqlcmd -Query "SELECT [ServerName]=@@servername" -ServerInstance "CTSTGDB"'

IF OBJECT_ID('tempdb..#Radhe','U') IS NOT NULL
   DROP TABLE #RADHE

CREATE TABLE #RADHE(I INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED, OUTPUT NVARCHAR(4000))

INSERT INTO #RADHE
 EXEC xp_cmdshell @sql

 SELECT * FROM #RADHE

 GO

代码语言:javascript
复制
OUTPUT
Invoke-Sqlcmd : A positional parameter cannot be found that accepts argument 
'[ServerName]=@@servername'.
At line:1 char:1
+ Invoke-Sqlcmd -Query SELECT [ServerName]=@@servername -ServerInstance ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Sqlcmd], ParameterB 
   indingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.SqlServer. 
   Management.PowerShell.GetScriptCommand

 
NULL

我发现了一篇有趣的文章:

将PowerShell输出写入Server表的6种方法

这是相关的,也可能是我工作方式的另一种选择。

从SSMS内部调用-Sqlcmd的问题到底是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-07 06:40:36

据我所知,您很难对与查询连接的服务器不同的服务器执行查询。在SSMS中,我至少可以想出两种方法来做到这一点:

  1. 如果当前服务器有一个链接的服务器,则可以使用EXEC 语句EXEC子句,如下所示:
代码语言:javascript
复制
declare @Sql nvarchar(max) = N'SELECT [ServerName]=@@servername,m.Match_id,
  m.HostfamilyId, hf.NIEFlag, ra.DS2019Sent 
FROM APIA_Repl_pub.dbo.repl_HostFamily hf 
  INNER JOIN APIA_Repl_pub.dbo.repl_Match m ON m.HostfamilyId =  hf.HostFamilyID
  INNER JOIN APIA_Repl_Pub.dbo.repl_Aupair ra on ra.AuPairID = m.AupairId
WHERE ra.JunoCore_applicationID = 459630';

-- This example assumes that the linked server name is the same as the remote server itself
exec (@Sql) at [CTSTGDB];
  1. 如果链接服务器不可用,则可以将SQLCMD模式用于查询:
代码语言:javascript
复制
:connect CTSTGDB
go

SELECT [ServerName]=@@servername,m.Match_id, m.HostfamilyId, hf.NIEFlag, ra.DS2019Sent 
FROM APIA_Repl_pub.dbo.repl_HostFamily hf 
INNER JOIN APIA_Repl_pub.dbo.repl_Match m ON m.HostfamilyId =  hf.HostFamilyID
INNER JOIN APIA_Repl_Pub.dbo.repl_Aupair ra on ra.AuPairID = m.AupairId
WHERE ra.JunoCore_applicationID = 459630;
go

:exit
go

此模式可以由查询-> SQLCMD模式菜单选项切换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64233080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档