現在、ローカルサーバーがリモートサーバーにリンクされています。
ローカルサーバー内でストアドプロシージャを作成することは可能ですが、リンクサーバー内のテーブルからデータをクエリします。パフォーマンスの問題が発生する可能性があることは承知していますが、リンクサーバーでspを作成するには、アクセス許可を取得する必要があるため、しぶしぶ思います。
私の問題は構文にあると思いますが、正確には何を特定できません、
USE [LOCALDB] --my local database or should I reference linked server db here
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[mystoredprocedure]
DECLARE @linkedserv NVARCHAR(150)
DECLARE @linkeddb NVARCHAR(150)
SET @linkedserv = 'HOSTNAME\SERVER';
SET @linkeddb = 'remotedb';
SELECT (CASE LTRIM(RTRIM([COLUMN1]))
WHEN '' Then ''
WHEN 'THIS' THEN 'THAT'
WHEN 'NOW' THEN 'NEVER'
ELSE 'OTHER' END) [Options]
INTO #TempTable
FROM @[email protected] --is this an issue?
FULL OUTER JOIN OtherTableOnLinkedServer ON TableOnLinkedServer.COUMN1 =
OtherTableOnLinkedServer.COLUMN0
リンクサーバーのdbとそのテーブルは、sp全体で複数回クエリされるため、それらを参照する簡単な方法を見つけることは素晴らしいことです。
乾杯
エンティティ名をT-SQLステートメントにパラメーター化することはできません。これを行うには、(a)最初に#tempテーブルを作成し、(b)動的SQLを使用する必要があります。ここに1つのアプローチがあります:
CREATE PROCEDURE [dbo].[mystoredprocedure]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @exec nvarchar(256),
@linkedserv nvarchar(150),
@linkeddb nvarchar(150),
@sql nvarchar(max);
SELECT @linkedserv = N'HOSTNAME\SERVER',
@linkeddb = N'remotedb';
SELECT @exec = QUOTENAME(@linkedserv) + N'.'
+ QUOTENAME(@linkeddb) + N'.sys.sp_executesql';
CREATE TABLE #TempTable([Options] varchar(64));
SELECT @sql = N'SELECT (CASE LTRIM(RTRIM(ot.[COLUMN1]))
WHEN '''' THEN ''''
WHEN ''THIS'' THEN ''THAT''
WHEN ''NOW'' THEN ''NEVER''
ELSE ''OTHER'' END) AS [Options]
FROM dbo.TableOnLinkedServer AS t
FULL OUTER JOIN dbo.OtherTableOnLinkedServer AS ot
ON t.COLUMN1 = ot.COLUMN0;';
INSERT #TempTable([Options]) EXEC @exec @sql;
SELECT * FROM #TempTable;
END
GO
動的SQL内でallできるので、前もって列を知ることが難しい場合は、方法があります。しかし、実際には#tempテーブルが必要であると想定すると、面倒です。これは、#TempTable
で行うすべてのことを動的SQL内で行う必要があるためです。
CREATE PROCEDURE [dbo].[mystoredprocedure]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @exec nvarchar(256),
@linkedserv nvarchar(150),
@linkeddb nvarchar(150),
@sql nvarchar(max);
SELECT @linkedserv = N'HOSTNAME\SERVER',
@linkeddb = N'remotedb';
SELECT @exec = QUOTENAME(@linkedserv) + N'.'
+ QUOTENAME(@linkeddb) + N'.sys.sp_executesql';
SELECT @sql = N'SELECT (CASE LTRIM(RTRIM(ot.[COLUMN1]))
WHEN '''' THEN ''''
WHEN ''THIS'' THEN ''THAT''
WHEN ''NOW'' THEN ''NEVER''
ELSE ''OTHER'' END) AS [Options]
INTO #TempTable
FROM dbo.TableOnLinkedServer AS t
FULL OUTER JOIN dbo.OtherTableOnLinkedServer AS ot
ON t.COLUMN1 = ot.COLUMN0;
SELECT * FROM #TempTable;';
EXEC @exec @sql;
END
GO
動的T-SQL に関する必須のErland Sommarskog記事を参照して、恥ずかしいSQLインジェクションの脆弱性を作成しないようにしてください。