标签: openrowset

无法确定元数据,因为语句调用了扩展存储过程

在 sql server 2012 中,我曾经通过获取 SP_HELP_JOB 的输出来查看作业

-- https://www.sqlservercentral.com/Forums/Topic259078-8-1.aspx
-- getting data from sp_help_job into a temp table
-- marcelo miorelli
-- 01-april-2013

IF OBJECT_ID('TEMPDB..#JOBiNFO') IS NOT NULL
   DROP TABLE #JobInfo

IF OBJECT_ID('TEMPDB..#ScheduleInfo') IS NOT NULL
   DROP TABLE #ScheduleInfo


SELECT * INTO #JobInfo
FROM OPENROWSET('sqloledb', 'server=(local);trusted_connection=yes'
, 'set fmtonly off exec msdb.dbo.sp_help_job -- @execution_status=4')


SELECT * INTO #ScheduleInfo
FROM OPENROWSET('sqloledb', 'server=(local);trusted_connection=yes'
, 'set fmtonly off  exec msdb.dbo.sp_help_schedule')
Run Code Online (Sandbox Code Playgroud)

现在在 sql server 2016 上这不起作用。

我收到此错误消息:

消息 11520,级别 16,状态 1,过程 sp_describe_first_result_set,第 1 …

sql-server dynamic-sql jobs openrowset sql-server-2016

9
推荐指数
1
解决办法
1万
查看次数

是否可以使用 OPENROWSET 导入固定宽度的 UTF8 编码文件?

我有一个包含以下内容的示例数据文件,并使用 UTF8 编码保存。

\n
oab~opqr\n\xc3\xb6ab~\xc3\xb6pqr\n\xc3\xb6ab~\xc3\xb6pqr\n
Run Code Online (Sandbox Code Playgroud)\n

该文件的格式是固定宽度,第 1 至第 3 列各分配 1 个字符,第 4 列保留 5 个字符。

\n

我创建了一个 XML 格式文件,如下所示

\n
<?xml version = "1.0"?>  \n<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  \n   <RECORD>  \n      <FIELD xsi:type="CharFixed" ID="Col1" LENGTH="1"/>       \n      <FIELD xsi:type="CharFixed" ID="Col2" LENGTH="1"/> \n      <FIELD xsi:type="CharFixed" ID="Col3" LENGTH="1"/> \n      <FIELD xsi:type="CharFixed" ID="Col4" LENGTH="5"/> \n      <FIELD xsi:type="CharTerm" ID="LINE_BREAK" TERMINATOR="\\n"/> \n   </RECORD>  \n   <ROW>  \n      <COLUMN SOURCE="Col1" NAME="Col1" xsi:type="SQLNVARCHAR"/>  \n      <COLUMN SOURCE="Col2" NAME="Col2" xsi:type="SQLNVARCHAR"/> \n      <COLUMN SOURCE="Col3" NAME="Col3" xsi:type="SQLNVARCHAR"/>  \n      <COLUMN SOURCE="Col4" NAME="Col4" xsi:type="SQLNVARCHAR"/> …
Run Code Online (Sandbox Code Playgroud)

sql-server azure-sql-database encoding openrowset

9
推荐指数
2
解决办法
3030
查看次数

从链接服务器获取@@SERVERNAME

这似乎是一个基本问题,但我找不到任何答案 - 我需要能够从链接服务器获取服务器名称/实例等。我尝试了几件事:

select <linked server>.@@SERVERNAME;
select <linked server>.SERVERPROPERTY('ServerName');
Run Code Online (Sandbox Code Playgroud)

......但没有快乐。有任何想法吗?

这是SQL 2008 R2& 2014(2008R2是链接服务器)

编辑:错误是:

消息 102,级别 15,状态 1,第 2 行“@@SERVERNAME”附近的语法不正确。

sql-server sql-server-2008-r2 linked-server openrowset exec

8
推荐指数
2
解决办法
2万
查看次数

链接服务器查询在哪里执行?

我有两个实例ServerAServerB,并且我在ServerA 中ServerB创建了一个链接服务器作为Linksrv_B

我可以使用四部分命名约定在ServerA上执行查询:

SELECT * FROM Linksrv_B.master.sys.databases
Run Code Online (Sandbox Code Playgroud)

OPENQUERY()

SELECT * FROM OPENQUERY(Linksrv_B, 'SELECT * FROM master.sys.databases')  
Run Code Online (Sandbox Code Playgroud)

我知道链接服务器使用分布式事务作为行集跨异构数据库工作。

  1. OLEDB 提供程序在哪里启动/连接?服务器A还是服务器B?
  2. 查询是在 ServerA 还是 ServerB 上执行的?优化器是否在哪个服务器上发挥作用?
  3. 结果集在哪里缓存?
  4. 谁能给我们一个详细的解释链接服务器是如何工作的。

sql-server linked-server distributed-transactions openrowset distributed-queries

8
推荐指数
1
解决办法
1753
查看次数

如何从表格中检索大文本?

为了我自己的记录,我在其中一台服务器上有一张表,我喜欢在其中保存我的活动和脚本

表定义是:

IF OBJECT_ID('[dbo].[activity]') IS NOT NULL 
DROP TABLE [dbo].[activity] 
GO
CREATE TABLE [dbo].[activity] ( 
[dt]        DATE                             NOT NULL,
[i]         SMALLINT                         NOT NULL,
[activity]  NVARCHAR(max)                     NOT NULL,
[script]    NVARCHAR(max)                     NULL  
           CONSTRAINT [DF__activity__script__6E01572D] DEFAULT (NULL))

GO
CREATE CLUSTERED INDEX [pk_activity] 
   ON [dbo].[activity] ([dt] desc, [i] desc)
Run Code Online (Sandbox Code Playgroud)

由于该表位于DBADBA_SERVER服务器上的数据库中,因此我从本地计算机创建了一个linked server到该表,DBA_SERVER以便我可以将脚本插入到我的表中。

这就是我将脚本插入我的表的方式,该脚本位于我的本地机器上:

    INSERT INTO [MY_DBA_SERVER].[DBA].[dbo].[activity]
               ([dt]
               ,[i]
               ,[activity]
               ,[script])
    SELECT
               DT=cast ('3 may 2018' as date)
               ,I=1100
               ,ACTIVITY='MOVE APPLICATION ROWS - the Ids work'
               ,[script]=BulkColumn 
    FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server blob openrowset sql-server-2016 bulk-insert

6
推荐指数
3
解决办法
3699
查看次数

使用 SQL 身份验证的 OPENDATASOURCE 命令的工作示例

我需要在数百个不属于域的服务器上运行一些临时查询。每个服务器都有一个低权限 SQL 用户帐户,该帐户对一些感兴趣的表具有只读访问权限。

我的想法是将这些服务器的名称存储在一个表中,并使用该表来驱动 OPENDATASOURCE 或 OPENROWSET 命令。

服务器要么在不同的域中,要么在不受信任的域中,要么在工作组中,等等。一团糟。

我一生都找不到如何配置这些命令以使用 SQL Server 帐户/密码组合的示例。

注意:这发生在沙箱中,并不适用于现实世界。这只是一个概念证明,因此安全性不是主要问题。这些服务器是通过一个模拟真实网络增长的过程产生的。

作为记录,我能够让 OPENROWSET 工作:

SELECT *
FROM OPENROWSET('SQLNCLI',
   'DRIVER={SQL Server};SERVER=MyServer;UID=MyUserID;PWD=MyCleverPassword',
   'select @@ServerName')         
Run Code Online (Sandbox Code Playgroud)

authentication sql-server openrowset

3
推荐指数
1
解决办法
3万
查看次数

文件导入的动态文件名

我试图找出一种方法,可以将文件名传递到可以导入文件的存储过程中。但是,动态设置SQL后,找不到对象。

DECLARE @fileName varchar(200), 
    @sql varchar(max);

SET @fileName = 'C:\file.csv';

SET @sql = 'SELECT *
    INTO #import
    FROM OPENROWSET(BULK ''' + @fileName + ''',
    FORMATFILE=''C:\format.xml'',
    FIRSTROW = 2) AS a';

EXEC(@sql);

SELECT * INTO #stage
FROM #import;
Run Code Online (Sandbox Code Playgroud)

结果

(27823 row(s) affected)
Msg 208, Level 16, State 0, Line 29
Invalid object name '#tmtImport'.
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 openrowset

3
推荐指数
1
解决办法
3226
查看次数

SQL Server - 链接服务器 - 将 OPENROWSET 与 Windows 集成安全性结合使用

我看过很多关于使用集成安全性(Windows 身份验证)的 OPENROWSET 的文章,但我无法让它为我工作。

使用 SQL Server 身份验证工作正常:

 select *
 FROM
 OPENROWSET('SQLOLEDB',
 'myserver';'monitor';'#J4g4nn4th4#',
 'SELECT GETDATE() AS [RADHE]')
Run Code Online (Sandbox Code Playgroud)

但我尝试使用 Windows 身份验证运行相同的查询,但它不起作用:

select *
 FROM
 OPENROWSET('SQLOLEDB',
'myserver';'Integrated Security=SSPI',
 'SELECT GETDATE() AS [RADHE]')
Run Code Online (Sandbox Code Playgroud)

有人可以发布一个有效的示例吗?

这是一篇描述 OPENROWSET 用法的好文章。

使用 OPENROWSET 的工作脚本示例 - 请阅读评论

 ----------------------------------------------------------------
 -- this works - linked server REPLON1
 ----------------------------------------------------------------

select *
 FROM
 OPENROWSET('SQLOLEDB',
'Server=REPLON1;Trusted_Connection=yes;',
 'SELECT GETDATE() AS [RADHE]')

 select *
 FROM
 OPENROWSET('SQLOLEDB',
'Server=REPLON1;Trusted_Connection=yes;',
 'SET FMTONLY OFF select * from sys.dm_exec_requests')


 SELECT a.*
FROM OPENROWSET('SQLOLEDB', 'server=replon1;Trusted_Connection=yes;', 'SET
FMTONLY OFF select * …
Run Code Online (Sandbox Code Playgroud)

security sql-server linked-server sql-server-2012 openrowset

3
推荐指数
1
解决办法
2万
查看次数

9 位邮政编码报告的 LEN 为 12

我正在尝试解决让邮政编码正确显示的一些困难。

原始电子表格具有混合 5 位和 9 位格式的邮政编码。导入过程后,这些 9 位邮政编码报告的长度为 12 位。现在,当我尝试在 9 位邮政编码中添加连字符“-”时,由于长度错误和各种数据类型转换问题,我得到了异常结果和错误。

导入是使用 openrowset 方法从电子表格导入数据执行的。

当我查询新导入的数据时,我看到邮政编码显示与电子表格中的相同,但长度错误。

SELECT ZIP,
    LEN(LTRIM(RTRIM(Zip))) AS ZIPLENGTH
  FROM XLS_IMPORT
Run Code Online (Sandbox Code Playgroud)
SELECT ZIP,
    LEN(LTRIM(RTRIM(Zip))) AS ZIPLENGTH
  FROM XLS_IMPORT
Run Code Online (Sandbox Code Playgroud)

如果我选择数据的左侧 9 个字符,则所有内容都将转换为浮点数,并且邮政编码现在无法读取。

SELECT LEFT(ZIP,9) FROM XLS_IMPORT
WHERE LEN(LTRIM(RTRIM(ZIP))) = 12
Run Code Online (Sandbox Code Playgroud)
ZIP         ZIPLENGTH
45750       5
432013256   12
441153221   12
44120       5
441351362   12
Run Code Online (Sandbox Code Playgroud)

如何将这些邮政编码恢复为正确的 9 位数字?或者如何在报告长度为 12 的 9 位邮政编码中添加连字符?我的最终目标是简单地让 9 位邮政编码在中间有一个连字符。

Zip列的数据类型是float.

我刚刚发现我的一些电子表格(如 NJ 和 NY)在邮政编码的前导 0 之前有一个撇号。我需要研究如何处理 '0xxxx 邮政编码,以使其在我的一些电子表格导入中工作。

sql-server sql-server-2012 openrowset

3
推荐指数
2
解决办法
1992
查看次数

无法确定元数据,因为存储过程包含动态 SQL

我有一个包含一些动态 SQL 的存储过程。我正在尝试使用执行存储过程,OPENROWSET但出现错误:

消息 11514,级别 16,状态 1,过程 sp_describe_first_result_set,第 1 行

无法确定元数据,因为语句 'EXEC sp_executesql @SQL, N'@row_count_out INT OUTPUT', @row_count_out = @row_count_table OUTPUT;' 在过程 'nachoTest' 中包含动态 SQL。考虑使用 WITH RESULT SETS 子句来显式描述结果集。

我真正的存储过程有点复杂,但这是错误的一个工作示例:

存储过程:

CREATE PROCEDURE nachoTest  @table_name NVARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @row_count_table INT
    DECLARE @SQL NVARCHAR(MAX)

    SET @SQL = N'SELECT @row_count_out = COUNT(*) FROM ' + @table_name
    EXEC sp_executesql @SQL, N'@row_count_out INT OUTPUT', @row_count_out = @row_count_table OUTPUT;

    SELECT @row_count_table AS row_count, @table_name AS table_name
END
GO
Run Code Online (Sandbox Code Playgroud)

调用它 …

sql-server stored-procedures dynamic-sql openrowset sql-server-2014

1
推荐指数
1
解决办法
1万
查看次数