取得 Execute SQL 裡面資料的值

原文: https://rainmakerho.github.io/2017/10/03/20171003-2/

(1) Store Procedue ,透過 sp_executesql + 它的 output 參數來取得資料
DECLARE @sql NVARCHAR(max), @outputcode NVARCHAR(4000);
SET @sql =
'EXEC SP_GETSERNO @RETURNS=@outputcode output';
exec sp_executesql @sql, N'@outputcode NVARCHAR(4000) out', @outputcode out
SELECT @outputcode;


(2) 取得 t-sql 裡面的內容,需要先建立 temp table ,或是 TABLE 變數,然後在 Exec 的 t-sql 裡面使用
DECLARE @ATT_IDENT TABLE (ATT_IDENT int);
INSERT @ATT_IDENT
exec ('SELECT top 1 ATT_IDENT FROM [dbo].[myTable]');
select * FROM @ATT_IDENT;


(3) t-sql,透過 sp_executesql + 它的 output 參數來取得資料,例如,
DECLARE @IDT NUMERIC
exec sp_executesql N'SELECT TOP 1 @IDT = ATT_IDENT FROM [dbo].[myTable]', N'@IDT NUMERIC out', @IDT OUT
SELECT @IDT;

(4) 透過 OPENQUERY 的方式,詳細可以參考「讓 Execute 可以搭配 Select Into,而不再只有 Insert into

SQL Server中DateTime与DateTime2的区别

DateTime字段类型对应的时间格式是 yyyy-MM-dd HH:mm:ss.fff ,3个f,精确到1毫秒(ms),示例 2014-12-03 17:06:15.433 。

DateTime2字段类型对应的时间格式是 yyyy-MM-dd HH:mm:ss.fffffff ,7个f,精确到0.1微秒(μs),示例 2014-12-03 17:23:19.2880929 。

如果用SQL的日期函数进行赋值,DateTime字段类型要用 GETDATE() ,DateTime2字段类型要用 SYSDATETIME() 。

MSDTC

如遇到CALL 遠端(LINK DB)的SP,收其產生的結果集,出現以下錯誤訊息

SAMPLE CODE:

 
IF OBJECT_ID (N'tempdb..#REL', N'U') IS NOT NULL
    DROP TABLE #REL

create table #REL
(
COL1 varchar(50) NOT NULL
,COL2 varchar(50) NULL  
)

insert into #REL
exec [1.2.3.4].XXDB.dbo.[SP_QryRM] 


解法1:

【Windows】啟用 MSDTC 服務與相關設定https://dotblogs.com.tw/echo/2017/08/24/windows_msdtc_setting

需要開很多PORT,調系統設定及重開機,超麻煩的。


解法2:

設定LINK DB,啟用RPC的分散式交易促銷設為FALSE


解法3:

OPENROWSET,可是在SQL 2016可能會有問題?

IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
    DROP TABLE #tmp
GO
CREATE TABLE #tmp (
    APPLY_HOUSE_SEQNO varchar(30),
    APPNO varchar(30)
    )

INSERT INTO #tmp           
SELECT *
FROM OPENROWSET('SQLOLEDB','1.2.3.4,1433';'ID';'PWD','SET FMTONLY OFF; EXEC XXDB.dbo.SP_ONLINE_888')

select * from #tmp 

linkDB的query_timeout & remote query timeout

在 MSSQL 預設的 timeout 時間是 600秒,如果在必要的狀況下必須修改 timeout 時間可以執行以下

USE master
GO
EXEC sp_configure 'remote query timeout', 6000
GO
RECONFIGURE
GO

6000 即為 timeout 秒數,用 RECONFIGURE 來生效。

設定 remote query timeout 伺服器組態選項
https://docs.microsoft.com/zh-tw/sql/database-engine/configure-windows/configure-the-remote-query-timeout-server-configuration-option?view=sql-server-2017