View Full Version : مشکل در syntax
  
ma.andishe
دوشنبه 04 فروردین 1393, 14:15 عصر
با سلام لطفا راهنمایی بفرمایید
من میخواهم به جای radifnemone یک متغییر بزارم که به ازای اون متغییر بره و فانکشم مورد نظر رو بخونه
SELECT
CT.__$start_lsn,
CT.__$operation,
CASE CT.__$operation
WHEN 1 THEN 'Delete'
WHEN 2 THEN 'Insert'
WHEN 3 THEN 'Update - Pre'
WHEN 4 THEN 'Update - Post'
END AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
            cdc.fn_cdc_get_net_changes_dbo_radifNemone (@from_lsn, @to_lsn, N'all update old') AS CT
                     INNER JOIN
               cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn
    
END
حمیدرضاصادقیان
سه شنبه 05 فروردین 1393, 09:44 صبح
سلام.
شما باید از dynamic Query استفاده کنید و اونجا رو با اسم یک متغیر پر کنید و اونو Exec کنید.
اگر در سایت هم جستجو کنید موارد متعددی رو میتونید پیدا کنید.
ma.andishe
چهارشنبه 06 فروردین 1393, 11:08 صبح
سلام ممنون از جوابتون ولی متاسفانه جواب نمیگیرم
ALTER PROCEDURE [dbo].[showchange]
@nametable nvarchar(50)
AS
declare @str nvarchar(max)
BEGIN
    SET NOCOUNT ON;
    DECLARE @from_lsn binary(10), @to_lsn binary(10)
SET @from_lsn = sys.fn_cdc_get_min_lsn(@nametable)
SET @to_lsn = sys.fn_cdc_get_max_lsn()
set @str=N'SELECT
CT.__$start_lsn,
CT.__$operation,
CASE CT.__$operation
WHEN 1 THEN D
WHEN 2 THEN I
WHEN 3 THEN U - Pre
WHEN 4 THEN U - Post
END AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
 cdc.fn_cdc_get_all_changes_dbo_@nametable (@from_lsn, @to_lsn, '') AS CT
 INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn)'
  Execute Sp_executeSQl @str
END
ma.andishe
چهارشنبه 06 فروردین 1393, 16:49 عصر
من این کد زو به صورتهای متفاوتی نوشتم ولی تا حالا جواب نگرفتم تمام مشکل من در خال خاضر پارامترهای اون تابع هستش که ست نمیشن و به همین دلیل جوابی رو بر نمیگردونه
declare @nametable nvarchar(50)
declare @str nvarchar(max)
DECLARE @from_lsn binary(10), @to_lsn binary(10)
BEGIN
set @nametable='radifnemone'
SET @from_lsn = sys.fn_cdc_get_min_lsn(@nametable)
print @from_lsn
SET @to_lsn = sys.fn_cdc_get_max_lsn()
print @to_lsn
set @str=N'SELECT
CT.__$start_lsn,
CT.__$operation,
CASE CT.__$operation
WHEN 1 THEN   D 
WHEN 2 THEN I
WHEN 3 THEN U - Pre
WHEN 4 THEN U - Post
END AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'('+ CONVERT(char(10),@from_lsn) +','+ CONVERT(char(10),@to_lsn) +', '') AS CT
 INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'
  print @str
  print @from_lsn 
  print @to_lsn 
END
حمیدرضاصادقیان
چهارشنبه 06 فروردین 1393, 19:23 عصر
اینو ببینید.
declare @nametable nvarchar(50) 
declare @str nvarchar(max)
DECLARE @from_lsn binary(10), @to_lsn binary(10)
 
BEGIN
 
 
set @nametable='radifnemone'
SET @from_lsn = sys.fn_cdc_get_min_lsn(@nametable)
print @from_lsn
SET @to_lsn = sys.fn_cdc_get_max_lsn()
print @to_lsn
 
 
set @str=N'SELECT
 
CT.__$start_lsn,
 
CT.__$operation,
 
CASE CT.__$operation
 
WHEN 1 THEN   D 
 
WHEN 2 THEN I
 
WHEN 3 THEN U - Pre
 
WHEN 4 THEN U - Post
 
END AS Operation,
 
CT.*,
 
LSN.tran_begin_time,
 
LSN.tran_end_time,
 
LSN.tran_id
 
FROM
 
cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'('+ CONVERT(char(10),@from_lsn) +','+ CONVERT(char(10),@to_lsn) +', QUOTENAME('')) AS CT
 
 
 
 INNER JOIN
 
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'
    
  print @str
  print @from_lsn 
  print @to_lsn 
 
END
البته باید مشخص کنید پارامترهای ورودی تابع رو مشخص کنید نوعشون چی هست؟؟
ma.andishe
چهارشنبه 06 فروردین 1393, 19:49 عصر
تشکر از اینکه جواب دادین
متاسفانه جواب نداد
ببینید پارامتر وروددیsp  نام جدول هستش که@nametabel 
پرامتر های تابع هم که از نوع باینری هستن
ممنون از اینکه وقت میزارید
ma.andishe
شنبه 09 فروردین 1393, 11:21 صبح
دوستان اگه کسی بلده خواهشا زاهنمایی کنه 
من به اینصوزت هم نوشتم ولی بازم ارور سینتکس رو میده
declare @nametable nvarchar(50)='radifnemone'
declare @str nvarchar(max)
--DECLARE @from_lsn char(10), @to_lsn char(10)
BEGIN
    
--SET @from_lsn = CONVERT(char(10), CONVERT(int,sys.fn_cdc_get_min_lsn(@nametable)))
----print @from_lsn
--SET @to_lsn =CONVERT(char(10), CONVERT(int,sys.fn_cdc_get_max_lsn() ))
--print @to_lsn 
set @str=N'SELECT
CT.__$start_lsn,
CT.__$operation,
CASE CT.__$operation
WHEN 1 THEN D ,
WHEN 2 THEN I,
WHEN 3 THEN U - Pre,
WHEN 4 THEN U - Post,
END AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'(sys.fn_cdc_get_min_lsn('+@nametable +')' + ', sys.fn_cdc_get_max_lsn()) AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'
execute sp_executesql @str
 
--print @str
END
ferdin
شنبه 09 فروردین 1393, 22:03 عصر
دوستان اگه کسی بلده خواهشا زاهنمایی کنه 
من به اینصوزت هم نوشتم ولی بازم ارور سینتکس رو میده
declare @nametable nvarchar(50)='radifnemone'
declare @str nvarchar(max)
--DECLARE @from_lsn char(10), @to_lsn char(10)
BEGIN
    
--SET @from_lsn = CONVERT(char(10), CONVERT(int,sys.fn_cdc_get_min_lsn(@nametable)))
----print @from_lsn
--SET @to_lsn =CONVERT(char(10), CONVERT(int,sys.fn_cdc_get_max_lsn() ))
--print @to_lsn 
set @str=N'SELECT
CT.__$start_lsn,
CT.__$operation,
CASE CT.__$operation
WHEN 1 THEN D ,
WHEN 2 THEN I,
WHEN 3 THEN U - Pre,
WHEN 4 THEN U - Post,
END AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'(sys.fn_cdc_get_min_lsn('+@nametable +')' + ', sys.fn_cdc_get_max_lsn()) AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'
execute sp_executesql @str
 
--print @str
END
دستور Case رو اشتباه نوشتی ، بعد از هر when نیازی به کاما (,) نیست.
SELECT 
 
CT.__$start_lsn,
 
CT.__$operation,
 (
CASE CT.__$operation
WHEN 1 THEN D 
WHEN 2 THEN I
WHEN 3 THEN U - Pre
WHEN 4 THEN U - Post
END) AS Operation,
 
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_radifnemone(sys.fn_ cdc_get_min_lsn(radifnemone), sys.fn_cdc_get_max_lsn()) AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn
ma.andishe
یک شنبه 10 فروردین 1393, 11:42 صبح
من به اون شکل هم نوشتم اگه بالا رو ببینی مشکل در کانورت کردن دیتا تایپ داخل تابع هستش که گیر میده و ارور incompatible  رو میده
ferdin
یک شنبه 10 فروردین 1393, 13:24 عصر
من به اون شکل هم نوشتم اگه بالا رو ببینی مشکل در کانورت کردن دیتا تایپ داخل تابع هستش که گیر میده و ارور incompatible  رو میده
دوست عزیز ، میشه دقیقا error رو اینجا بزاری ، چون شما گفتی syntax error داری نه مشکل تو کانورت کردن.
ma.andishe
یک شنبه 10 فروردین 1393, 15:32 عصر
سلام ممنون که زمان میزاری
ببینید الان در حال حاضر  ظاهرا  ارور سینتکسش  برطرف شده ولی دیتایی رو بر نمیگردونه
من ازپرنت رشته ای که درست میکنه کپی میگرم و اونو اجرا میکنم  این ارور رو میده
Msg 102, Level 15, State 1, Line 30
Incorrect syntax near 'A6800'.
ضمنا خواستی تست کنی همین اسکریپت که پاین رو تست کن
declare
@nametable nvarchar(30)='radifnemone'
declare
 @str nvarchar(max)
DECLARE @from_lsn varbinary(10), @to_lsn varbinary(10),@row_filter_option nvarchar(30) = N'all'
 
BEGIN
    
SET @from_lsn = sys.fn_cdc_get_min_lsn(@nametable)
--print @from_lsn
SET @to_lsn =sys.fn_cdc_get_max_lsn() 
--print @to_lsn 
set @str=N'SELECT
CT.__$start_lsn,
CT.__$operation,
CASE CT.__$operation
WHEN 1 THEN   D 
WHEN 2 THEN I
WHEN 3 THEN U - Pre
WHEN 4 THEN U - Post
END AS Operation,
CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
    
cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'('+CONVERT(VARCHAR(10), @from_lsn,2)+','+CONVERT(VARCHAR(10), @to_lsn,2)+','+@row_filter_option+') AS CT
 INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'
 exec sp_executesql @str
print @str
END
ma.andishe
دوشنبه 11 فروردین 1393, 19:36 عصر
دوستان کسی نیست کمک کنه؟
ببینیید من مساله جور دیگه میگم
توی یک کوئری که به صورت داینامیک نوشته شده چطور میشه متغیرهایی رو در اون جا داد یعنی کانورت کرد که شکل ظاهری اون متغییر عوض نشه چون  برای سنجیدن استفاده میشه
این متغیره در اصل باینری هستند  و باید به صورت استرینگ در داخل کوئری داینامیک استفاده شود
ma.andishe
سه شنبه 12 فروردین 1393, 12:01 عصر
دوستان به این شکل نوشتم جواب داد
USE [kaavianmfs]
GO
/****** Object:  StoredProcedure [dbo].[showchange]    Script Date: 04/01/2014 10:25:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[showchange]
@nametable nvarchar(15)
AS
  declare @str nvarchar(max),@row_filter_option nvarchar(30) =  '''all'''
    declare @from_lsn varbinary(30)=null, @to_lsn varbinary(30)=null
       declare @begin_time datetime, @end_time datetime
          declare @DELETE CHAR(10)='''DEL''',@INSERT CHAR(10)='''INS''',@UPDATE_PRE  CHAR(10)='''U-PRE''',@UPDATE_POS CHAR(10)='''U-POS'''
        SET @begin_time = GETDATE()-7;
         --print @begin_time
         SET @end_time = GETDATE();
              --print    @end_time
BEGIN
    SET NOCOUNT ON;
 SELECT @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
   --print @from_lsn
  SELECT @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than', @end_time);
      --print @to_lsn
 set @str =N'select sys.fn_cdc_map_lsn_to_time(__$start_lsn) AS ChangeDTS
           , 
          CASE __$operation
         WHEN 1 THEN '+ @DELETE +'
         WHEN 2 THEN '+ @INSERT +'
         WHEN 3 THEN '+ @UPDATE_PRE +'
         WHEN 4 THEN '+ @UPDATE_POS +'
       END AS Operation,*
       
       from
            cdc.fn_cdc_get_all_changes_dbo_'+ LTRIM(rtrim(@nametable))+'('+CONVERT(varchar(max), @from_lsn,1)+','+CONVERT(varchar(max), @to_lsn,1)+','+  @row_filter_option +')'
 exec sp_executesql @str 
--print @str
end
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.