ChatGPT告诉我如何根据特定需求查询远程SQL服务器(但我不得不多次询问)
使用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问题2
我说我无法在远程服务器上制作表格。回应是使用 SQL 的 FOR XML PATH 生成逗号分隔的列表。
我会省略代码,因为我遇到了一个错误:
“在ASSIGNMENT语句中不允许使用FOR XML子句”
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的帮助(在查询字符串中硬编码逗号分隔的值)。