もう1つのオプションは動的SQLです。
DECLARE @sql NVARCHAR(MAX) = N'SELECT
col FROM [Database'
+ CASE @param WHEN 'X' THEN 'A' ELSE 'B' END + '].dbo.table
WHERE ...';
EXEC sp_executesql @sql;
連結する場合は、次のように言います。
+ ' WHERE somecol <= dateadd(DAY, 1, ' + @DATE + '))';
そうすると、エラーが発生します(ただし、指摘したエラーは発生しません)。動的SQLがないため、ペーストビンコードのどこでエラーが発生しているかを判断するのは困難です。ただし、上記のパターンの代わりに、強く型付けされたパラメーターを使用する必要があります。
DECLARE @date DATE = '2013-03-11'; -- no m/d/y ugliness please
DECLARE @sql NVARCHAR(MAX) = N'SELECT
col FROM [Database'
+ CASE @param WHEN 'X' THEN 'A' ELSE 'B' END + '].dbo.table
WHERE somecol <= dateadd(DAY, 1, @date_param))';
EXEC sp_executesql @sql, N'@date_param DATE', @date;
変数名を変更したので、どのように渡されるかがわかります。
整理しようとしている新しいペーストビンを編集します。変更する必要があります。
EXEC sp_executesql @SQL, N'@date_param DATE', @DATE;
に:
EXEC sp_executesql
@SQL, -- unparameterized command
N'@USERID VARCHAR(100), @OURORDERDATE DATE', -- param list
@USERID, -- param 1
@OURORDERDATE; -- param 2
ユーザーXとYがデータベース1にあり、他のユーザーがデータベース2にあると仮定すると、より多くの毛糸を解き、より多くの歯を引っ張ることができます。
DECLARE @sql NVARCHAR(MAX) = N'USE Database'
+ CASE WHEN @UserID IN ('X','Y') THEN '1' ELSE '2' END
+ ';';
SELECT ...all the join stuff from your pastebin...
WHERE (TABEL2.SOLDTOCUSTID = @USERID)
and TABEL2.OURORDERDATE >= DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0)
and (TABEL2.OURORDERDATE <= dateadd(day, 1, @OURORDERDATE));';
EXEC sp_executesql
@SQL, -- unparameterized command
N'@USERID VARCHAR(100), @OURORDERDATE DATE', -- param list
@USERID, -- param 1
@OURORDERDATE; -- param 2