sql >> Databasteknik >  >> RDS >> Access

Text eller numeriskt fält – en enkel SQL-metod för att byta datatyp

Text eller numeriskt fält – en enkel SQL-metod för att byta datatyp

Jag arbetade nyligen med ett projekt där vår kund säljer en produkt i hela USA byggd på Access med SQL Server, det fungerar genom att importera data till SQL och sedan analysera det med Access-rapporter. Tyvärr kan varje kund ha ett primärnyckelformat som ett långt heltal och andra där det är en sträng, (kombination av siffror och strängar), upptäckte vi snabbt att det orsakade problem med rapporter som inte sorterades korrekt. Rapporterna utformades med heltal i åtanke och strängarna förstörde ordningen. Vi behövde komma på en lösning som inte krävde att lägga till kod till vårt Access-gränssnitt för att hantera problemet, utan snarare använda kraften i SQL Server för att tillhandahålla data oavsett vilket format som används på primärnyckeln.

Visningar till undsättning

En bra sak med att länka SQL Server-vyer och tabeller i Access:Du kan ge dem vilket namn du vill. Jag utnyttjade den genom att ta bort källan till den länkade tabellen för att se om primärnyckeln är en sträng eller lämna den som den ursprungliga tabellen om det var ett heltal. Att ha samma tabellnamn i Access oavsett källa innebar att jag inte behövde ändra min kod.

Vi driver länkning med hjälp av en SQL Server-tabell

Juan har bloggat om körtabelllänkning från SQL Server, där vi använder kod för att läsa poster i en tabell som heter tblTablePermissions för att skapa länkarna i vårt Access-gränssnitt med VBA-kod. Vanligtvis länkar vi bara i början av projektet eller när en ny tabell läggs till servern, men för det här projektet behövde jag ta det ett steg längre genom att byta ut tabellnamnet med vynamnet i tblTablePermissions om klienten använder en sträng för primärnyckel.

Det finns två fält i tblTablePermissions, ett som heter Table_Name och ett annat som heter AccessName, vår kod använder den förra för att veta vilken tabell eller vy som ska användas som källa och den senare för tabellnamnet i Access. Allt jag gjorde var att skapa ett enkelt skript som min kund kan köra för att byta ut tabellnamnen med vynamn för varje installation som behövde det.

Här är skriptet jag använde:

--Update tblTablePermissions For Numeric Type Code--
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

DELETE FRÅN [dbo].[tblTablePermissions]
WHERE [Table_Name] =('tabellnamn1')
eller [Table_Name] =('tabellnamn2')
eller [Table_Name] =('tabellnamn3' )

IINSERT INTO [dbo].[tblTablePermissions] ([Table_Name], [Access_Name], [IndexedColumns], [UserSelect], [UserInsert], [UserUpdate], [UserDelete])
VÄRDEN ('vw_tabellnamn1', 'tabellnamn1', ”, 'True', 'True', 'True', 'True'),
('vw_tablename2', 'tabellnamn2', 'field1,field2,field3 ', 'True', 'True', 'True', 'True'),
('vw_tablename3', 'tablename3', 'field1,field2', 'True', 'True', 'True', 'Sant')

I mitt skript ovan tar jag först bort tabellerna från tblTablePermissions som jag vill byta med vyer och sedan använder jag en insert-sats för att lägga till vyerna som kommer att ersätta tabellerna, notera att vynamnen är olika men fältet Access_Name är samma som de raderade, vilket gör att min åtkomstkod fungerar oavsett vilken primärnyckelfältstyp som används.

Hur jag använde CAST för att översätta primärnyckeln

I vyerna använde jag CAST-funktionen för att konvertera fältet Typ från en sträng till ett heltal:

CREATE VIEW vw_tablename1
AS
SELECT RangeID,
UseFlagAsNeeded,
CAST(Type AS int) AS Type,
Line,
Ownership,
Include,
Public,
Limit,
RangeA,
RangeB,
RangeC,
SSMA_TimeStamp
FROM dbo.tablename1;
GO

Vår klient kan nu enkelt konfigurera varje installation baserat på kundens data!


  1. SQL Server DELETE – Ta bort en eller flera rader från en tabell med något avancerade scenarier

  2. Ändra en befintlig kolumn till en beräknad kolumn i SQL Server (T-SQL-exempel)

  3. Kan en Check-begränsning relatera till en annan tabell?

  4. Hur man slumpmässigt ställer in text till knappar från SQLite utan upprepning?