I am a newbie within tablevalued types in MS SQL. But until now I have searched a lot to find a solution. Maybe I don't know how to use them :-( I have a problem using them and the error says (translated into english)
SqlVariantTable is not compatible with NVARCHAR.
So I really hope that someone can give me a hint that points into the right direction.
My stored procedure looks like this:
CREATE PROCEDURE [dbo].[DuplicateLevel4] @UserID INT AS
SET NOCOUNT ON
DECLARE @dubletNo NVARCHAR(4000),
@subDubletNo NVARCHAR(4000),
@Vennenr NVARCHAR(4000),
@fornavn NVARCHAR(4000),
@shortenfornavn NVARCHAR(4000),
@efternavn NVARCHAR(4000),
@adresse NVARCHAR(4000),
@postnr NVARCHAR(4000),
@telefon NVARCHAR(4000),
@tlf1 NVARCHAR(4000),
@email NVARCHAR(4000),
@done BIT,
@oldTime DATETIME,
@selectsql NVARCHAR(4000),
@CountFriendID NVARCHAR(4000),
@ParamString NVARCHAR(4000)
SET @dubletNo = 1
DECLARE @Table dbo.SqlVariantTable;
DELETE FROM @Table
INSERT INTO @Table VALUES (@CountFriendID)
INSERT INTO @Table VALUES (@vennenr);
SET @ParamString = '@CountFriendID NVARCHAR(4000) output, @vennenr NVARCHAR(4000)';
SET @selectsql = '';
SET @selectsql = @selectsql + 'SELECT @CountFriendID = Count(Vennenr) ';
SET @selectsql = @selectsql + 'FROM Medlemsdata ';
SET @selectsql = @selectsql + 'LEFT OUTER JOIN Postnumre ';
SET @selectsql = @selectsql + 'RIGHT OUTER JOIN MedlemsAdresse ON Postnumre.Postnummer = MedlemsAdresse.Postnr ON Medlemsdata.FK_AdrID = MedlemsAdresse.AdrID ';
SET @selectsql = @selectsql + 'WHERE (Vennenr <> @Vennenr) ';
IF @shortenfornavn IS NOT NULL BEGIN SET @selectsql = @selectsql + 'AND Upper_Fornavn_FirstPart = @shortenfornavn ' SET @ParamString = @ParamString + ', @shortenfornavn varchar(max)' INSERT INTO @Table VALUES (@shortenfornavn) END ELSE SET @selectsql = @selectsql + 'AND Upper_Fornavn_FirstPart IS NULL ';
IF @efternavn IS NOT NULL BEGIN SET @selectsql = @selectsql + 'AND Upper_Efternavn = @efternavn ' SET @ParamString = @ParamString + ', @efternavn varchar(max)' INSERT INTO @Table VALUES (@efternavn) END ELSE SET @selectsql = @selectsql + 'AND Upper_Efternavn IS NULL ';
IF @email IS NOT NULL BEGIN SET @selectsql = @selectsql + 'AND Upper_Email = @email ' SET @ParamString = @ParamString + ', @email varchar(max)' INSERT INTO @Table VALUES (@email) END ELSE SET @selectsql = @selectsql + 'AND Upper_Email IS NULL ';
SET @selectsql = @selectsql + 'AND (ISNULL(telefon,'''') LIKE ''%'' + @telefon1 + ''%'') AND (LEN(@telefon2) > 7) ';
SET @selectsql = @selectsql + 'AND vennenr > 0 ';
SET @selectsql = @selectsql + 'AND vennenr NOT IN (SELECT FriendID FROM DuplicateForgetFriends WHERE ALevelNo = 4) ';
SET @selectsql = @selectsql + 'AND vennenr NOT IN (SELECT FriendID FROM DuplicateList) ';
SET @ParamString = @ParamString + ', @telefon1 varchar(max), @telefon2 varchar(max)';
EXECUTE sys.sp_executesql @selectsql, @ParamString, @Table;
IF @CountFriendID > 0 BEGIN
DELETE FROM @Table
INSERT INTO @Table VALUES (@dubletNo)
INSERT INTO @Table VALUES (@subDubletNo)
INSERT INTO @Table VALUES (@vennenr);
SET @ParamString = '@dubletNo NVARCHAR(4000), @subDubletNo NVARCHAR(4000), @vennenr NVARCHAR(4000)'
SET @selectsql = '';
SET @selectsql = @selectsql + 'INSERT INTO DuplicateList (FriendID, DubletNo, SubDubletNo, [UseOrganisation], [UseFornavn], [UseEfternavn], [UseAdresse], [UsePostCode], [UseTlf1], [UseTlf2], [UseEmail], [Choice], [AKeep], [UseBornDate]) ';
SET @selectsql = @selectsql + 'SELECT Vennenr, @dubletNo, ROW_NUMBER() OVER (ORDER BY Vennenr) + @subDubletNo, 0,0,0,0,0,0,0,0,0,0,0 ';
SET @selectsql = @selectsql + 'FROM Medlemsdata ';
SET @selectsql = @selectsql + 'LEFT OUTER JOIN Postnumre ';
SET @selectsql = @selectsql + 'RIGHT OUTER JOIN MedlemsAdresse ON Postnumre.Postnummer = MedlemsAdresse.Postnr ON Medlemsdata.FK_AdrID = MedlemsAdresse.AdrID ';
SET @selectsql = @selectsql + 'WHERE (Vennenr <> @Vennenr) ';
IF @shortenfornavn IS NOT NULL BEGIN SET @selectsql = @selectsql + 'AND Upper_Fornavn_FirstPart = @shortenfornavn ' SET @ParamString = @ParamString + ', @shortenfornavn varchar(max)' INSERT INTO @Table VALUES (@shortenfornavn) END ELSE SET @selectsql = @selectsql + 'AND Upper_Fornavn_FirstPart IS NULL ';
IF @efternavn IS NOT NULL BEGIN SET @selectsql = @selectsql + 'AND Upper_Efternavn = @efternavn ' SET @ParamString = @ParamString + ', @efternavn varchar(max)' INSERT INTO @Table VALUES (@efternavn) END ELSE SET @selectsql = @selectsql + 'AND Upper_Efternavn IS NULL ';
IF @email IS NOT NULL BEGIN SET @selectsql = @selectsql + 'AND Upper_Email = @email ' SET @ParamString = @ParamString + ', @email varchar(max)' INSERT INTO @Table VALUES (@email) END ELSE SET @selectsql = @selectsql + 'AND Upper_Email IS NULL ';
SET @selectsql = @selectsql + 'AND (ISNULL(telefon,'''') LIKE ''%'' + @telefon1 + ''%'') AND (LEN(@telefon2) > 7) ';
SET @selectsql = @selectsql + 'AND vennenr > 0 ';
SET @selectsql = @selectsql + 'AND vennenr NOT IN (SELECT FriendID FROM DuplicateForgetFriends WHERE ALevelNo = 4) ';
SET @selectsql = @selectsql + 'AND vennenr NOT IN (SELECT FriendID FROM DuplicateList) ';
SET @ParamString = @ParamString + ', @telefon1 varchar(max), @telefon2 varchar(max)';
INSERT INTO @Table VALUES (@telefon)
INSERT INTO @Table VALUES (@telefon)
EXECUTE sys.sp_executesql @selectsql, @ParamString, @Table;
END
My type look like this:
CREATE TYPE [dbo].[SqlVariantTable] AS TABLE(
[Value] [NVARCHAR(4000)] NULL
)
I really hope that someone can give me an idea to what to look after, so I can avoid this error.
Thanks in advance,
Michael