ChatGPT告诉我如何根据特定需求查询远程SQL服务器(但我不得不多次询问)

ChatGPT中文站

使用SQL Server,我想查询一个远程服务器(即链接服务器),并使用几个可能的自定义值。我使用ChatGPT来寻求帮助。虽然它确实提供了答案,但需要尝试几次。

没有使用远程服务器查询多个值的简单示例

如果只有几个值,我会这样做:

SELECT * FROM myTable WHERE employeeID IN (1, 3, 9, 20)

如果我有“很多”值,我会制作一个临时表,类似于这样:

DROP TABLE IF EXISTS #temp

CREATE TABLE #temp (
employeeId INT
);

INSERT INTO #temp (employeeId) VALUES (1), (3), (9), (20) . . .
-- #temp would store several values (ex. 50)

SELECT * FROM myTable WHERE employeeID IN (SELECT * FROM #temp)

我想要避免的事情

这个查询是有效的:

SELECT * FROM OPENQUERY(myConnection,
'SELECT * FROM myTable WHERE employeeID IN (''1'', ''3'', ''9'', ... )

但我不想手动键入50多个值到我的IN语句中。我希望它来自一个表格。

是的,我确实有使用SublimeText和/或Excel快速完成此操作的键盘快捷键,但我正在寻找另一种方式...

问题

这是我第一次连接远程服务器(一个 MS SQL Server 到另一个)查询多个自定义值:

注意:这不起作用。

DROP TABLE IF EXISTS #temp

CREATE TABLE #temp (
employeeId INT
);

INSERT INTO #temp (employeeId) VALUES (1), (3), . . .
-- #temp would have a total of 50 values

SELECT * FROM OPENQUERY(myConnection,
'SELECT * FROM myTable WHERE employeeID IN (SELECT * FROM #temp)')

ChatGPT问题1

我问为什么上面的代码没有运行。回复是:

在 SQL Server 中使用 OPENQUERY 从 Linked Server 查询数据时,您不能直接引用本地服务器上的临时表。原因是临时表对每个会话是特定的,不可跨连接或服务器访问。

然后建议我在远程服务器上创建一个新的表来存储我的值。

ChatGPT中文站

ChatGPT问题2

我说我无法在远程服务器上制作表格。回应是使用 SQL 的 FOR XML PATH 生成逗号分隔的列表。

我会省略代码,因为我遇到了一个错误:

“在ASSIGNMENT语句中不允许使用FOR XML子句”

ChatGPT中文站

ChatGPT问题3

在道歉后,以下代码被创建来在循环中创建一个逗号分隔的字符字符串:

DECLARE @ValuesList VARCHAR(MAX) = ''
DECLARE @Value VARCHAR(MAX)

DECLARE myCursor CURSOR FOR
SELECT [field] FROM #temp

OPEN myCursor
FETCH NEXT FROM myCursor INTO @Value

WHILE @@FETCH_STATUS = 0
BEGIN
SET @ValuesList = @ValuesList + ',' + QUOTENAME(@Value, '''')
FETCH NEXT FROM myCursor INTO @Value
END

CLOSE myCursor
DEALLOCATE myCursor

SET @ValuesList = STUFF(@ValuesList, 1, 1, '') -- Remove the leading comma

DECLARE @Query NVARCHAR(MAX)
SET @Query = 'SELECT * FROM table WHERE field IN (' + @ValuesList + ')'

SELECT *
FROM OPENQUERY(mySource, @Query)

ChatGPT问题4

我把它放进我的代码里,但得到了另一个。

“@Query”附近的语法不正确。

当我在SQL Server Management Studio中悬停“@Query”时,它说“预期字符串或TEXT_LEX”。

根据ChatGPT的说法,问题在于“似乎由于将动态查询作为参数传递给OPENQUERY函数的限制而导致错误发生”。

以下是最终的工作代码:

DECLARE @ValuesList VARCHAR(MAX) = ''
DECLARE @Value VARCHAR(MAX)

DECLARE myCursor CURSOR FOR
SELECT [field] FROM #temp

OPEN myCursor
FETCH NEXT FROM myCursor INTO @Value

WHILE @@FETCH_STATUS = 0
BEGIN
SET @ValuesList = @ValuesList + ',' + QUOTENAME(@Value, '''')
FETCH NEXT FROM myCursor INTO @Value
END

CLOSE myCursor
DEALLOCATE myCursor

SET @ValuesList = STUFF(@ValuesList, 1, 1, '') -- Remove the leading comma

DECLARE @Query NVARCHAR(MAX)
SET @Query = 'SELECT * FROM table WHERE field IN (' + @ValuesList + ')'

DECLARE @RemoteQuery NVARCHAR(MAX)
SET @RemoteQuery = 'SELECT * FROM OPENQUERY(mySource, ''' + REPLACE(@Query, '''', '''''') + ''')'

EXEC (@RemoteQuery)

总结

  • ChatGPT非常令人印象深刻。
  • 你可能需要多次询问你的问题才能得到你想要的答案。
  • 这生成了很多代码,尝试了几次才完成。如果我赶时间的话,我应该直接使用自己的原始解决方案而不是ChatGPT的帮助(在查询字符串中硬编码逗号分隔的值)。
ChatGPT中文站

2023-10-20 17:08:09 AI中文站翻译自原文