Hemil Gandhi Ответов: 1

Соедините запрос из одной БД в другую с помощью переменной


Здравствуйте кодеры, я хочу запустить ниже упомянутый запрос из одной таблицы в другую, также имя таблицы постоянно меняется, я должен объявить их, вот где я застрял.

Пожалуйста, веди меня.

Что я уже пробовал:

DeclArE @LONDATE As chAr(11)='LON20190629'
DeclArE @ADVDATE As chAr(11)='ADV20190629'
SELECT l.BrCode,l.Code,CONCAT(l.BRCODE,l.CODE,RIGHT('000000'+CAST(l.Acno AS VARCHAR(6)),6)) AS ACNO,c.name,c.PAN,l.CustNo,l.LIMITAMT,l.SECVALUE,(l.ClearBal+l.AccumuInt+l.clgamt) AS BALANCE ,l.NPACode,l.NPADt,l.OverdueAmt,l.UnreserveInt ,l.INTIND7AMT,l.PENALINTIND7AMT,l.AcSts,l.Limit,l.DueInst,l.InstAmt FROM MIS.dbo.@LONDATE l ,MIS.dbo.customer c where l.custno=c.Code and AcSts<>9 AND ClearBal<0
UNION ALL
SELECT a.BrCode,a.Code,CONCAT(a.BRCODE,a.CODE,RIGHT('000000'+CAST(a.Acno AS VARCHAR(6)),6)) AS ACNO,c.Name,c.PAN,a.CustNo,a.LIMITAMT,a.SECVALUE,(a.ClearBal+a.AccumuInt+a.clgamt) AS BALANCE,a.NPACode,a.NPADt,a.OverdueAmt,a.UnreserveInt,a.INTIND7AMT,a.PENALINTIND7AMT,a.AcSts,a.Limit,'0' as DueInst,'0' asInstAmt FROM MIS.dbo.@ADVDATE a,MIS.dbo.customer c where a.custno=c.Code and AcSts<>9 AND ClearBal<0

DerekT-P

Я думаю, вам нужно упростить свой запрос, чтобы мы могли видеть, что вы пытаетесь сделать. Название вопроса относится к "Одна БД к другой с использованием переменной", но ваше SQL - соединение включает только одну базу данных: MIS.dbo- где другая база данных?
Я думаю, что ваша проблема заключается в том, что вам нужно объединить две таблицы (или даже получить доступ только к одной из них), но имя таблицы, которое вам нужно запросить, зависит от даты, и поэтому вам нужно параметризовать имя таблицы-это правильно? Пожалуйста, подтвердите, и, если это так, кто-то здесь сможет вам помочь.

Hemil Gandhi

Я получил ответ, хотя спасибо за попытку

Hemil Gandhi

В приведенной выше таблице NPADt-это дата,имеющая три типа данных 0, null или date i.e (20200807). Как показать дату в формате ДД-ММ-гггг??

DerekT-P

Вам лучше всего задать новый вопрос в, ГМ, новом вопросе; тем более, что этот уже помечен как решенный. (Во-первых, другие люди тогда смогут искать и находить решение, если у них есть подобная проблема)

1 Ответов

Рейтинг:
7

Richard Deeming

Вы не можете использовать переменную для ссылки на имя таблицы, если не используете динамический SQL. Если вы идете по этому пути, убедитесь, что вы очень тщательно проверили имена таблиц, чтобы избежать этого SQL-инъекция[^] факторы уязвимости.

Declare @LONDATE As char(11) = 'LON20190629';
Declare @ADVDATE As char(11) = 'ADV20190629';

Declare @LonDateTable As sysname;
Declare @AdvDateTable As sysname;
Declare @query nvarchar(max);

SELECT @LonDateTable = name
FROM MIS.sys.tables
WHERE SCHEMA_NAME(schema_id) = 'dbo'
And name = @LONDATE;

SELECT @AdvDateTable = name
FROM MIS.sys.tables
WHERE SCHEMA_NAME(schema_id) = 'dbo'
And name = @ADVDATE;

SET @query = N'SELECT l.BrCode, l.Code, CONCAT(l.BRCODE, l.CODE, RIGHT(''000000'' + CAST(l.Acno AS VARCHAR(6)), 6)) AS ACNO, c.name, c.PAN, l.CustNo, l.LIMITAMT, l.SECVALUE, (l.ClearBal + l.AccumuInt + l.clgamt) AS BALANCE, l.NPACode, l.NPADt, l.OverdueAmt, l.UnreserveInt, l.INTIND7AMT, l.PENALINTIND7AMT, l.AcSts, l.Limit, l.DueInst, l.InstAmt FROM MIS.dbo.' + QuoteName(@LonDateTable) + N' As l INNER JOIN MIS.dbo.customer c ON l.custno = c.Code WHERE AcSts != 9 AND ClearBal < 0

UNION ALL

SELECT a.BrCode, a.Code, CONCAT(a.BRCODE, a.CODE, RIGHT(''000000'' + CAST(a.Acno AS VARCHAR(6)), 6)) AS ACNO, c.Name, c.PAN, a.CustNo, a.LIMITAMT, a.SECVALUE, (a.ClearBal + a.AccumuInt + a.clgamt) AS BALANCE, a.NPACode, a.NPADt, a.OverdueAmt, a.UnreserveInt, a.INTIND7AMT, a.PENALINTIND7AMT, a.AcSts, a.Limit, ''0'' as DueInst, ''0'' as InstAmt FROM MIS.dbo.' + QuoteName(@AdvDateTable) + N' a INNER JOIN MIS.dbo.customer c ON a.custno = c.Code WHERE AcSts != 9 AND ClearBal < 0';

EXEC sp_executesql @query;
sp_executesql (Transact-SQL) - SQL Server | Microsoft Docs[^]

NB: Это похоже на плохой дизайн базы данных. Там должен быть один LON стол и один-единственный ADV таблица с соответствующей датой, хранящейся против каждой записи. Если вас беспокоит размер данных, вы можете использовать секционированную таблицу:
Секционированные таблицы и индексы - SQL Server | Microsoft Docs[^]


Hemil Gandhi

Большое спасибо, приятель, ты спас мне много сил....

Hemil Gandhi

В приведенной выше таблице NPADt-это дата,имеющая три типа данных 0, null или date i.e (20200807). Как показать дату в формате ДД-ММ-гггг??

Richard Deeming

Преобразуйте его в date введите запрос и отформатируйте его в коде пользовательского интерфейса.

CASE WHEN a.NPADt Is Null THEN Null WHEN a.NPADt = 0 THEN Null ELSE Convert(date, Convert(char(8), a.NPADt), 112) END As NPADt