具有类型为的动态SQL和sp_executesql的MS SQL问题

具有类型为的动态SQL和sp_executesql的MS SQL问题,sql,sql-server,stored-procedures,dynamic,sp-executesql,Sql,Sql Server,Stored Procedures,Dynamic,Sp Executesql,我是MS SQL中表值类型的新手。但直到现在,我一直在寻找解决方案。也许我不知道如何使用它们:-(我在使用它们时遇到问题,错误是(翻译成英语) SqlVariantTable与NVARCHAR不兼容 所以我真的希望有人能给我一个提示,指出正确的方向 我的存储过程如下所示: CREATE PROCEDURE [dbo].[DuplicateLevel4] @UserID INT AS SET NOCOUNT ON DECLARE @dubletNo NVARCHAR(4000),

我是MS SQL中表值类型的新手。但直到现在,我一直在寻找解决方案。也许我不知道如何使用它们:-(我在使用它们时遇到问题,错误是(翻译成英语)

SqlVariantTable与NVARCHAR不兼容

所以我真的希望有人能给我一个提示,指出正确的方向

我的存储过程如下所示:

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
CREATE TYPE [dbo].[SqlVariantTable] AS TABLE(
    [Value] [NVARCHAR(4000)] NULL
)
我真的希望有人能给我一个关于如何照顾的想法,这样我就可以避免这个错误。
提前感谢,

Michael我毫不怀疑我们需要所有这些代码。花点时间给我们一个提示。(旁注,为什么你所有的参数都是
nvarchar(4000)
?例如,我不希望某人的名字有4000个字符长,也不希望有电子邮件地址,并且名字像
@dubletNo
@subveletno
表明他们持有的是数字数据,而不是字符串数据。但是,错误告诉了你问题所在。我假设你正在将
varchar
进行比较>sql_variant
或尝试将一个连接到它(示例
选择CONVERT(sql_variant,'abc')+'def';
返回错误“数据类型sql_variant和varchar在add运算符中不兼容”。)@Larnu为冗长的过程感到抱歉-我现在缩短了它。你为什么在你的类型中使用
sql\u variant
?据我所知,你只在其中插入varchar…但是,正如我所说,我不能(这里的其他人也不能)运行该进程。我没有访问你的实例的权限,这意味着我甚至看不到你正在生成的动态语句的样子。我不能重复,请花时间生成一个。没有它,我们无法帮助你,除了告诉你我在我的实例中做了什么,你需要找出比较/连接在哪里发生